Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift闭包未设置变量_Swift_Firebase_Firebase Realtime Database_Closures_Firebase Authentication - Fatal编程技术网

Swift闭包未设置变量

Swift闭包未设置变量,swift,firebase,firebase-realtime-database,closures,firebase-authentication,Swift,Firebase,Firebase Realtime Database,Closures,Firebase Authentication,我试图设置一个变量,该变量位于闭包内部的闭包外部,但它最终没有被设置。但是,我正在将变量设置为的值打印到控制台。另外,在设置返回变量并打印它本身之后,正确的值将被打印到控制台。当我返回变量时,问题就出现了;其值与初始化时的值保持相同。以下是一些psuedo代码: let str: String = { var ret: String = "default value" functionWithClosure(with: (some_name) in { if l

我试图设置一个变量,该变量位于闭包内部的闭包外部,但它最终没有被设置。但是,我正在将变量设置为的值打印到控制台。另外,在设置返回变量并打印它本身之后,正确的值将被打印到控制台。当我返回变量时,问题就出现了;其值与初始化时的值保持相同。以下是一些psuedo代码:

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

希望对您有所帮助。ObservesingEvent正在异步工作

您可以这样做:

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

以下可能是该问题的解决方案

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

请说明您得到的错误以及它是编译时错误还是运行时错误。我没有得到错误。问题是
ret
在返回时保持为“默认值”。如果同时提供闭包代码将更有帮助。
functionWithClosure
您正在使用。我添加了更具体的代码。闭包方法是异步方法,因此在闭包完成执行之前调用返回。您可以通过调试代码将断点放在
return
行和
print(ret\u name)
行上进行检查。首先调用
return
。这就是它返回默认值的原因。请说明您得到的错误以及是编译时错误还是运行时错误。我没有得到错误。问题是
ret
在返回时保持为“默认值”。如果同时提供闭包代码将更有帮助。
functionWithClosure
您正在使用。我添加了更具体的代码。闭包方法是异步方法,因此在闭包完成执行之前调用返回。您可以通过调试代码将断点放在
return
行和
print(ret\u name)
行上进行检查。首先调用
return
。这就是它返回默认值的原因。mm,检查其他答案:)mm,检查其他答案:)我如何让另一个函数返回
ret_name
?@ArchieGertsman的值?你是什么意思?您现在可以像我在下面写的那样使用getRetname。ret_name现在是您的打印值我如何让另一个函数返回
ret_name
的值?@ArchieGertsman您的意思是什么?您现在可以像我在下面写的那样使用getRetname。ret_name现在是您的打印值