【发布时间】:2017-09-17 22:46:14
【问题描述】:
我正在尝试在该闭包内设置一个位于该闭包之外的变量,但它最终并没有被设置。但是,我将变量设置为 的值正在打印到控制台。此外,在设置返回变量并自行打印之后,正确的值将被打印到控制台。当我返回变量时出现问题;它的值与初始化时的值相同。这是一些伪代码:
let str: String = {
var ret: String = "default value"
functionWithClosure(with: (some_name) in {
if let name = some_name {
ret = name
print(name) // prints successfully
print(ret_name) // also prints successfully
}
})
return ret // returns "default value"
}()
这是不起作用的实际代码:
let name: String = {
var ret_name = "default value"
if let uid = FIRAuth.auth()?.currentUser?.uid {
FIRDatabase.database().reference().child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
if let name = dictionary["name"] as? String {
ret_name = name
print(ret_name)
}
}
})
}
return ret_name
}()
【问题讨论】:
-
请提及您遇到的错误以及它是编译时错误还是运行时错误。
-
我没有收到错误消息。问题是
ret在返回时保持为“默认值”。 -
如果您也提供关闭代码会更有帮助。
functionWithClosure您正在使用。 -
我添加了更具体的代码。
-
您的闭包方法是一个异步方法,因此在您的闭包完成执行之前调用 return。您可以通过调试代码在
return行和print(ret_name)行上放置断点来检查它,return将首先被调用。这就是它返回默认值的原因。
标签: swift firebase firebase-realtime-database closures firebase-authentication