Swift 6中闭包抛出错误因类型不匹配无法重抛,这是Bug吗?
这不是Swift 6的Bug,是严格类型检查的预期行为
在Swift 6中,针对带泛型约束的抛出闭包,编译器对错误类型的推断和检查变得更加严格。你的代码出现报错的原因如下:
- 嵌套枚举的类型推断限制:
InternalError是定义在foo()函数内部的嵌套枚举,编译器处理闭包时,没有自动将throw InternalError.failed的错误类型精准推断为InternalError,而是默认推断为any Error,这就和AsyncOperation要求的throws(InternalError)闭包类型不匹配。 - Swift 6的严格错误类型检查:Swift 6强化了
throws(Failure)这种显式错误类型约束的检查,不再允许隐式地将具体错误类型向上转换为any Error后再匹配泛型约束。
修复方案
你可以通过以下几种方式解决这个问题:
方案1:显式标注闭包的类型
在闭包中明确指定返回值和抛出错误的类型,帮助编译器精准推断:
AsyncOperation<Int, InternalError> { () async throws(InternalError) -> Int in throw InternalError.failed }
方案2:将错误类型移到函数外部
把InternalError的定义从foo()内部移出,让编译器能更清晰地识别其类型:
enum InternalError: Swift.Error { case failed } func foo() async { AsyncOperation<Int, InternalError> { throw InternalError.failed } }
方案3:显式转换错误类型
如果必须保留嵌套枚举,可以在throw时显式转换类型:
AsyncOperation<Int, InternalError> { throw InternalError.failed as InternalError }
内容的提问来源于stack exchange,提问作者Klein Mioke
相关产品推荐
相关产品推荐

