我试图从嵌套函数的内部返回一个函数的值。我明白为什么它不工作,但我只需要知道一个解决我的类型的问题。
在我的代码中,我正在检查是否已经在我的Firebase数据库中创建了一个人。因此,在usersRef函数中,您将看到如果从火基返回的值为“零”,则用户尚未创建,反之亦然。
当我说:return userBool
时,它给了我这个错误:
Unexpected non-void return value in void function
我一直在寻找一个干净的解决办法,但我唯一能想到的就是每次我都要检查它时,必须一次又一次地创建这个函数。显然,我不想这样做,哈哈,所以如果你能帮我解决这个问题,并给出一些解决方案,让我知道!:)
func checkIfUserExists(userID : String) -> Bool {
var userBool = Bool()
var usersRef = FIRDatabase.database().reference()
usersRef.child("users").child(userID).observeSingleEvent(of: .value, with: {
snapshot in
if snapshot.value != nil {
userBool = true
return userBool
}
else {
userBool = false
return userBool
}
})
}
最新情况:
感谢你的建议,我增加了一个完整的,它工作得很好。:)
func checkIfUserExists(userID : String, completion: @escaping (_ success: Bool) -> ()){
var userBool = Bool()
var usersRef = FIRDatabase.database().reference()
usersRef.child("users").child(userID).observeSingleEvent(of: .value, with:{
snapshot in
if snapshot.value != nil {
print("userBool!", userBool)
userBool = true
}
else {
print("userBool2!", userBool)
userBool = false
}
completion(userBool)
})
}
发布于 2017-01-18 21:01:18
没有办法从内在的外在功能中返回。我能想到的唯一方法是使用一个完成处理程序,然后可以从嵌套函数中调用,如下所示:
func checkIfUserExists(userID : String, completion: @escaping (_ userExists: Bool) -> Void)
发布于 2017-01-18 20:59:19
问题是你处于封闭状态,这并不意味着返回类型.你是怎么称呼这个函数的?
一些想法:*向这个函数传递一个闭包,然后调用该函数,而不是试图返回。
而且,它看起来不像
if snapshot.value != nil {
userBool = true
return userBool
}
else {
userBool = false
return userBool
}
你可以这么做:
guard snapshot = snapshot else { return }
return snapshot.value
发布于 2017-01-18 21:16:31
如果observeSingleEvent(...)
函数同步执行对其调用的闭包,则返回所需内容的唯一方法是可能的。
如果是真的,您可以尝试以下方法:
func checkIfUserExists(userID : String) -> Bool {
var userBool = false
var usersRef = FIRDatabase.database().reference()
usersRef.child("users").child(userID).observeSingleEvent(of: .value, with: {
userBool = $0.value != nil
})
return userBool
}
如果observeSingleEvent(...)
的闭包在一段时间后被调用,按照Moritz的建议,在闭包中返回方法的结果,而不是返回值。
https://stackoverflow.com/questions/41729227
复制相似问题