我有一个关闭功能,可以从Web服务器上载和返回数据。以下代码将打印我想要的值。
loadData1(onCompletion: { (json) in
print(json)
})
我的问题是我需要将打印值设置为等于变量以在函数外部使用。我已经尝试过了:
let x = loadData1(onCompletion: { (json) in
return json
})
但是我收到警告“常数'x'被推断为类型'()',这可能是意外的”,并且x的值等于“()”。作为参考,json的类型为[[String:String]]。
编辑: 目前有这个
var x = [[String: String]]()
override func viewDidLoad() {
super.viewDidLoad()
loadData1(onCompletion: { (json) in
self.x = json
})
print(x)
}
它正在打印“ []”。
答案 0 :(得分:2)
尝试在闭包内部设置x变量的值:
loadData1(onCompletion: { (json) in
x = json
})
在用闭包初始化的方法变量x中,这就是收到警告的原因。
直到执行闭包,变量x的默认值为var x = [[String: String]]()
或者如果您未提供默认值和声明,则保持未解决状态。
答案 1 :(得分:1)
var x = [[String: String]]()
func loadData1(onCompletion: @escaping ([[String: String]]) -> ())
{
//do your stuff here and assume you get your data
let data = [["key": "str"]]
//then call completion callback
onCompletion(data)
}
override func viewDidLoad() {
super.viewDidLoad()
loadData1(onCompletion: { json in
self.x = json
print(self.x)
})
//if you print here can not make sure you finished loadData1() because it is a async call.
}
答案 2 :(得分:0)
您似乎要使用的闭包正在异步函数中运行(您可以通过参数名称onCompletion
来猜测)。这意味着print(x)
在调用完成处理程序之前执行,因此json
的值尚未分配。要快速修复,您可以在内部移动print(x)
。
loadData1(onCompletion: { (json) in
self.x = json
print(self.x) // Now you guaranteed to have the value assigned to x before printing
})