You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift函数声明返回Bool却无法返回值,报非void返回值错误

解决Swift函数checkUserSetup返回Bool时的异步报错问题

嘿,这个问题我之前也踩过坑!核心原因是你用的Firebase observeSingleEvent是异步操作——它不会立刻给出结果,而是等Firebase拉取到数据后,再触发你传入的闭包执行。但你的外层函数标注了返回Bool,可你试图在这个本身无返回值的闭包里写return,编译器肯定会报错;而且就算你强行写return,外层函数也早就执行完毕了,根本拿不到异步操作的最终结果。

给你两个实用的解决方案:

方案一:用完成回调闭包(兼容所有iOS版本)

把返回逻辑改成通过闭包传递,这是处理异步操作的经典写法,兼容性拉满:

func checkUserSetup(userID: String, completion: @escaping (Bool) -> Void) {
    self.ref.child("userInfo").observeSingleEvent(of: .value, with: { snapshot in
        let isSetupDone = snapshot.hasChild(userID)
        if isSetupDone {
            print("DU HAR GÅTT GJENNOM SETUP!")
        }
        // 把结果通过回调传递出去
        completion(isSetupDone)
    })
}

// 调用示例
checkUserSetup(userID: "你的用户ID") { isCompleted in
    // 在这里处理返回的Bool值,比如更新UI或做业务判断
    print("用户是否完成设置:\(isCompleted)")
}

方案二:用Async/Await(iOS 15+、macOS 12+等现代系统)

如果你的项目支持较新的系统版本,用Swift的async/await会让代码更简洁,写法接近同步逻辑:

func checkUserSetup(userID: String) async -> Bool {
    return await withCheckedContinuation { continuation in
        self.ref.child("userInfo").observeSingleEvent(of: .value, with: { snapshot in
            let isSetupDone = snapshot.hasChild(userID)
            if isSetupDone {
                print("DU HAR GÅTT GJENNOM SETUP!")
            }
            // 把结果传递给continuation,让async函数完成返回
            continuation.resume(returning: isSetupDone)
        })
    }
}

// 调用需要在async上下文里,比如用Task包裹
Task {
    let isCompleted = await checkUserSetup(userID: "你的用户ID")
    print("用户是否完成设置:\(isCompleted)")
}

简单复盘下:你原来的写法错误在于,试图在异步闭包里直接返回值——这个闭包本身是Void类型(无返回值),不允许返回内容;同时异步操作的结果无法直接作为外层函数的返回值,必须通过回调或者async/await这类异步语法来处理结果传递。

内容的提问来源于stack exchange,提问作者Svein Bruce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:39:46