Swift 6:Task内使用Typed Throws遇类型推断错误求助
问题原因
Swift 5.9引入的Typed Throws(带类型的抛出)虽能让异步函数明确声明抛出的错误类型,但在Task闭包的catch块中,编译器暂时无法自动推断捕获到的error就是你声明的MyError类型——它会把error视为底层的_ErrorCodeProtocol协议类型,自然找不到.one成员。
解决办法
有几种简单方式可以修复这个问题:
方法1:显式类型转换
在catch块里先把error转换成MyError类型,再进行匹配:
func anotherTest() { Task { do { try await test() } catch let myError as MyError { switch myError { case .one: print("one") } } catch { // 处理其他可能的错误(如果有的话) print("其他错误:\(error)") } } }
方法2:直接在catch中匹配错误类型
利用Swift的模式匹配,直接在catch分句里指定MyError.one,无需额外switch:
func anotherTest() { Task { do { try await test() } catch MyError.one { print("one") } catch { // 处理其他错误 print("其他错误:\(error)") } } }
方法3:在switch中添加类型判断
如果一定要用switch,可以在case里先明确类型:
func anotherTest() { Task { do { try await test() } catch { switch error { case let err as MyError where err == .one: print("one") default: print("其他错误:\(error)") } } } }
补充说明
非异步代码能正常运行,是因为同步函数的throws(MyError)在catch时,编译器能直接推断错误类型;但Task属于独立的异步任务上下文,当前Swift编译器的类型推断还未覆盖这个场景,因此需要手动明确类型。
内容的提问来源于stack exchange,提问作者wshamp
相关产品推荐
相关产品推荐

