摘自The Swift Bugs Future的Ghost帖子,这是帖子末尾提到的协议扩展的分发规则。
- 如果变量的推断类型是协议:
- 并且该方法在原始协议中定义,然后调用运行时类型的实现,而不管扩展中是否存在默认实现。
- 并且该方法未在原始协议中定义,然后调用默认实现。
- 如果变量的推断类型是类型,则调用该类型的实现。
因此,根据您的情况,您是说method1()在协议中定义,并且已在子类中实现。但是您的超类正在采用协议,但未实现method1(),子类只是从超类继承而未直接采用协议。这就是为什么我认为这就是为什么当您调用foo.method1()时,它没有调用第1点和第2点所述的子类实现的原因。
但是当你这样做时
class SomeSuperclass: TheProtocol {func method1(){ print("super class implementation of method1()")}}class MyClass : SomeSuperclass {override func method1() { print("Called method1 from MyClass implementation")}override func method2NotInProtocol() { print("Called method2NotInProtocol from MyClass implementation")}}
然后当你打电话时,
let foo: TheProtocol = MyClass()foo.method1() // Called method1 from MyClass implementationfoo.method2NotInProtocol()
因此,此bug(似乎是bug)的解决方法是,您需要在超类中实现protocol方法,然后需要在子类中覆盖protocol方法。高温超导
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)