![](/img/trans.png)
[英]Setting a closure as a variable in Swift and trying to call from Objective C class
[英]Swift closure not setting variable
我試圖設置一個變量,該變量位於該閉包內部的閉包外部,但最終不會被設置。 然而,為了正被打印到控制台我設置的變量的值。 同樣,在設置返回變量並自行打印之后,將正確的值打印到控制台。 當我返回變量時就會出現問題。 它的值與初始化時的值相同。 這是一些偽代碼:
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
})
希望能幫助到你
可能是下面的問題的解決方案。
func getName(completion: @escaping(_ name: 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 {
completion(name)
}
}
})
}
現在通過以下代碼設置字符串的值
getName(completion: { name in
let str = name
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.