Xcode Swift中async/await读取文本文件返回Bool报错问题
问题解决:异步验证函数无法正确返回Bool类型
错误根源
test()函数声明返回Bool,但内部用Task.init包裹异步逻辑后,实际返回的是Task<Bool, any Error>类型,和声明的返回类型不匹配,导致类型转换报错。此外,包含异步操作的函数必须标记async,若涉及错误抛出还需添加throws。
修正方案
1. 重构test()为异步函数
移除多余的Task包裹,直接在异步上下文执行逻辑,同时标记函数为async throws(适配grabString()的错误抛出特性):
func test() async throws -> Bool { let myResult = try await grabString() return myResult == "ConnectionOK" }
2. 调整调用方checkStatus()
由于test()变为异步函数,调用时必须使用await,有两种处理方式:
方式一:将checkStatus()改为异步函数
func checkStatus() async throws { if try await test() { // 执行你的业务逻辑 print("连接状态正常") } else { print("连接状态异常") } }
方式二:在同步函数内用Task触发异步逻辑
如果checkStatus()必须保持同步,可以用Task启动异步任务:
func checkStatus() { Task { do { if try await test() { // 执行你的业务逻辑 print("连接状态正常") } else { print("连接状态异常") } } catch { print("请求过程出错:\(error)") } } }
3. 优化grabString()的安全性
原代码中强制解包String(data: data, encoding: .utf8)!易引发崩溃,建议改为可选绑定处理:
func grabString() async throws -> String { guard let url = URL(string: "https://www.blahblahblah.txt") else { throw URLError(.badURL) } let (data, _) = try await URLSession.shared.data(from: url) guard let myString = String(data: data, encoding: .utf8) else { throw NSError(domain: "StringDecodeError", code: -1, userInfo: [NSLocalizedDescriptionKey: "无法将数据解析为UTF-8字符串"]) } return myString }
内容的提问来源于stack exchange,提问作者slicerdicer
相关产品推荐
相关产品推荐

