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
相关产品推荐
相关产品推荐

