-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

毫米,请检查其他答案:) –