首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌套函数中函数的返回值(Swift 3= Xcode)

嵌套函数中函数的返回值(Swift 3= Xcode)
EN

Stack Overflow用户
提问于 2017-01-18 20:52:21
回答 4查看 2.6K关注 0票数 2

我试图从嵌套函数的内部返回一个函数的值。我明白为什么它不工作,但我只需要知道一个解决我的类型的问题。

在我的代码中,我正在检查是否已经在我的Firebase数据库中创建了一个人。因此,在usersRef函数中,您将看到如果从火基返回的值为“零”,则用户尚未创建,反之亦然。

当我说:return userBool时,它给了我这个错误:

代码语言:javascript
运行
复制
Unexpected non-void return value in void function

我一直在寻找一个干净的解决办法,但我唯一能想到的就是每次我都要检查它时,必须一次又一次地创建这个函数。显然,我不想这样做,哈哈,所以如果你能帮我解决这个问题,并给出一些解决方案,让我知道!:)

代码语言:javascript
运行
复制
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
        }
    })
}

最新情况:

感谢你的建议,我增加了一个完整的,它工作得很好。:)

代码语言:javascript
运行
复制
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)
    })
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-18 21:01:18

没有办法从内在的外在功能中返回。我能想到的唯一方法是使用一个完成处理程序,然后可以从嵌套函数中调用,如下所示:

代码语言:javascript
运行
复制
func checkIfUserExists(userID : String, completion: @escaping (_ userExists: Bool) -> Void)
票数 2
EN

Stack Overflow用户

发布于 2017-01-18 20:59:19

问题是你处于封闭状态,这并不意味着返回类型.你是怎么称呼这个函数的?

一些想法:*向这个函数传递一个闭包,然后调用该函数,而不是试图返回。

  • 将结果的映射保存在某个地方,从闭包中更新结果,并始终对照该映射进行检查。

而且,它看起来不像

代码语言:javascript
运行
复制
if snapshot.value != nil {
        userBool = true
        return userBool
    }
    else {
        userBool = false
        return userBool
    }

你可以这么做:

代码语言:javascript
运行
复制
guard snapshot = snapshot else { return }
return snapshot.value
票数 1
EN

Stack Overflow用户

发布于 2017-01-18 21:16:31

如果observeSingleEvent(...)函数同步执行对其调用的闭包,则返回所需内容的唯一方法是可能的。

如果是真的,您可以尝试以下方法:

代码语言:javascript
运行
复制
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的建议,在闭包中返回方法的结果,而不是返回值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41729227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档