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)
}
}
}
urlsession.shared.datatask
是一个异步函数。这意味着它独立执行,并在将来完成一个不确定的时间。
在它后面的{}
中向它提供的内容称为完成处理程序或回调函数--这是datatask
在执行结束后调用的代码,因此依赖于返回值的任何事情都需要在闭包中进行。
不幸的是,这意味着您不能直接从checkBarcode
函数返回String
。但是,您也可以为它创建一个回调函数:
func checkBarCode(barcode: String, completion: @escaping (String) -> Void) {
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) {
self.productName = self.getProductInfo(json: jsonString)
print("checkBarCode: " + self.productName)
completion(self.productName)
}
}
}.resume()
}
checkBarCode(barcode: "") { productName in
//do something that depends on the value
}
问题内容: 我正在尝试使用NSLocalizedString本地化我的应用程序。当我导入XLIFF文件时,大多数工作都像一个超级按钮,但是有些却没有,有些字符串没有本地化。我注意到问题出在NSLocalizedString中,其中包含一些变量,例如: 要么 也许这不是这类东西的正确语法。有人可以向我解释如何迅速做到这一点?非常感谢你。 问题答案: 您可以在中使用format参数,因此您的示例如下所
问题内容: 这里发生了什么事? 它抛出一个错误,说 我正在做的是将值重新分配给一个已经声明的变量。 问题答案: 将新值分配给现有变量时,请从第二条语句中删除。 当您像在第一个语句中那样第一次执行简短声明和赋值时使用。
问题内容: 我知道这个答案已经以其他形式发布在这里,但是我想了解更多有关迅速覆盖实例变量的信息。 假设我有这段代码 好。从我读到的内容来看,常量需要覆盖前缀。其他答案说我应该声明setter和getter?为什么?我真的不在乎这两个。我只需要替换值即可。我真的不能使用重写,因为我是从UIView继承的,这可能很危险(我认为)。 任何建议都欢迎。 问题答案: 如您所说,您不能简单地在子类中重新定义常
问题内容: 我在检测有人何时按下音量调高按钮时遇到问题。目前,我只是播放文件,但我想知道用户何时按下按钮以在音量变化时显示警报。我正在开发Swift,并且正在使用AVFoundation创建此播放器。目前,我找不到适用于Swift的东西。我是这种语言的新手。 问题答案: 这应该可以解决问题。
问题内容: 我试图设置一个变量,该变量位于该闭包内部的闭包外部,但最终不会被设置。然而,我设置变量的值 是 正在打印到控制台。同样,在设置返回变量并自行打印之后,将正确的值打印到控制台。当我返回变量时就会出现问题。其值与初始化时的值相同。这是一些伪代码: 这是不起作用的实际代码: 问题答案: .observeSingleEvent正在异步工作。 您可以执行以下操作: 然后,您可以在任何需要的地方使
问题内容: jQuery的 我正在发出一个AJAX请求,该请求会使用服务器的响应来更新变量()的值。这是我正在使用的代码: 问题是的值仍然是一个空字符串。我知道这不是服务器端脚本的问题,因为我会收到错误警报,或者至少得到string 。 这是一个演示问题的JSFiddle:http : //jsfiddle.net/GGDX7/ 为什么不变的价值? 纯JS 我正在发出一个AJAX请求,该请求会使用