我试图在闭包内部设置闭包外部的变量,但它最终并没有被设置。但是,我将变量设置为 的值 正在打印到控制台。此外,在设置返回变量并自行打印之后,正确的值将打印到控制台。当我返回变量时出现问题;它的值与初始化时的值保持不变。这是一些伪代码:
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
}()
最佳答案
.observeSingleEvent 正在异步工作。
你可以这样做:
func getRetname(completion: @escaping(_ retName: String) -> Void) {
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)
completion(ret_name)
}
}
})
}
然后,您可以在任何地方使用它:
getRetname(completion: { ret_name in
// ret_name - your data
})
希望对你有帮助
关于Swift 闭包不设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43534111/