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

Xcode 16.2中重写Operation的completionBlock属性导致构建失败

解决Xcode 16.2中重写Operation completionBlock的类型不匹配问题

问题原因

Xcode 16.2对应的Swift版本中,Apple对系统Operation类的completionBlock属性做了更新:原本的属性类型@Sendable () -> Void?被修改为**@MainActor限定的属性**,其实际类型等价于(@MainActor @Sendable () -> Void)?。这是因为completionBlock的执行逻辑本身就保证在主线程,官方通过@MainActor明确了这一上下文约束,导致旧的子类重写代码出现类型不匹配错误。

正确解决方案

重写completionBlock时,需要为子类的属性添加@MainActor限定,确保与父类的属性上下文约束一致,同时保持闭包类型与父类匹配:

open class TTOperation : Operation {
    @MainActor
    override open var completionBlock: (@Sendable () -> Void)? {
        get {
            // 自定义get逻辑,或直接返回super.completionBlock
            return super.completionBlock
        }
        set {
            // 自定义set逻辑,或直接赋值给super.completionBlock
            super.completionBlock = newValue
        }
    }
}

为什么之前的尝试失败

  • 添加@unchecked Sendable:问题本质是@MainActor的上下文约束不匹配,而非Sendable合规性,所以该声明无法解决类型冲突。
  • 直接在闭包类型中添加@MainActor:这种写法会让子类属性的类型比父类更严格(父类是属性被@MainActor限定,而非闭包本身显式带@MainActor),导致编译器认为子类类型无法覆盖父类类型,从而报错。

内容的提问来源于stack exchange,提问作者kanchan waghmare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:27:10