My SwiftUI app has a class which parses JSON Data.
As you can see from the comments near the print
, I do not understand while the line print("return: " + self.productName)
print the variable still empty (basically the initialized one).
Why is the variable updated inside the if block, but not outside?
Any idea? Thanks.
class ProductDecoer: ObservableObject {
@Published var productName: String = ""
func checkBarCode(barcode: String) -> String {
let api = <url>
let barcode = barcode
let format = ".json"
let url = URL(string: api + barcode + format)
URLSession.shared.dataTask(with: url!) { [self] data, response, error in
if let data = data {
if let jsonString = String(data: data, encoding: .utf8) {
productName = self.getProductInfo(json: jsonString)
print("checkBarCode: " + self.productName) // --> print correctly
}
}
}.resume()
self.productName = productName
print("return: " + self.productName) // --> is empty
return self.productName
}
func getProductInfo(json: String) -> String {
let jsonData = json.data(using: .utf8)!
let productInfo: ProductInfo = try! JSONDecoder().decode(ProductInfo.self, from: jsonData)
self.productName = productInfo.product_name
print("AAA: " + self.productName)
print("Prodotto: " + productInfo.product_name)
productName = productInfo.product_name
print("CC: " + productName)
return productName
}
struct ProductInfo: Codable {
var code: String
var product_name: String
enum CodingKeys: String, CodingKey {
case code
case product
enum ProductCodingKeys: String, CodingKey {
case product_name
}
}
init(from decoder: Decoder) throws {
let rootContainer = try decoder.container(keyedBy: CodingKeys.self)
let productContainer = try rootContainer.nestedContainer(keyedBy: CodingKeys.ProductCodingKeys.self, forKey: .product)
code = try rootContainer.decode(String.self, forKey: .code)
product_name = try productContainer.decode(String.self, forKey: .product_name)
print("BB: " + product_name)
}
func encode(to encoder: Encoder) throws {
var rootContainer = encoder.container(keyedBy: CodingKeys.self)
var productContainer = rootContainer.nestedContainer(keyedBy: CodingKeys.ProductCodingKeys.self, forKey: .product)
try rootContainer.encode(code, forKey: .code)
try productContainer.encode(product_name, forKey: .product_name)
}
}
}