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