-2

我想設置一個變量,該變量在閉包內部的閉包之外,但最終不會結束。但是,將變量設置爲的值是正在打印到控制檯。此外,在設置返回變量並自行打印之後,正確的值將被打印到控制檯。當我返回變量時出現問題;其值保持與初始化時的值相同。下面是一些僞代碼:快速關閉不設置變量

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 
}() 
+0

設置字符串的值請註明您獲得的是編譯時間或運行時錯誤的錯誤,以及提。 –

+0

我沒有收到錯誤。問題是'ret'在返回時保持爲「默認值」。 –

+0

如果你提供你的閉包代碼以及你正在使用的'functionWithClosure',它會更有幫助。 –

回答

1

.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 
}) 

希望它可以幫助

+0

如何讓另一個函數返回'ret_name'的值? –

+0

@ArchieGertsman你是什麼意思? 你可以使用現在的getRetname,就像我在下面寫的那樣。現在您的打印值爲 –

1

可能低於可以爲鍛鍊問題。

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 
}) 
+0

毫米,請檢查其他答案:) –