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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:07:07