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
相关产品推荐
相关产品推荐

