Swift中便利初始化器引发协议不兼容编译错误的原因咨询
问题分析:便利初始化器中的参数传递错误导致编译失败
你遇到的这个编译错误其实是个很容易犯的小疏忽——你在便利初始化器里错误地传递了协议类型,而不是传入的实例参数。
咱们看报错的那行代码:
self.init(store: IngressEventStore)
这里你写的IngressEventStore是协议本身的类型(对应报错里的IngressEventStore.Protocol),但你的指定初始化器init(store: IngressEventStore)需要的是一个符合该协议的实例对象,不是协议类型本身,这就导致了类型不匹配的编译错误。
而你改用单个指定初始化器时,直接把传入的store实例赋值给属性,没有这个错误的参数传递,所以编译正常。
修正后的正确代码
只需要把便利初始化器里的调用改成传入参数store即可,另外还要注意补上父类初始化器的调用(Operation是NSOperation的子类,必须调用父类初始化方法):
public protocol IngressEventStore { func doSomething() } public class AddEventsToStoreOperation: Operation { private let store: IngressEventStore var events: [IngressEvent]? // 指定初始化器 init(store: IngressEventStore) { self.store = store super.init() // 补上父类初始化调用 } // 修正后的便利初始化器 convenience init(store: IngressEventStore, events: [IngressEvent]) { self.init(store: store) // 传入参数store,而非协议类型 self.events = events } }
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

