具有超类和子类的Swift协议扩展方法分派

具有超类和子类的Swift协议扩展方法分派,第1张

具有超类和子类的Swift协议扩展方法分派

摘自The Swift Bugs Future的Ghost帖子,这是帖子末尾提到的协议扩展的分发规则。

  1. 如果变量的推断类型是协议:
  2. 并且该方法在原始协议中定义,然后调用运行时类型的实现,而不管扩展中是否存在默认实现。
  3. 并且该方法未在原始协议中定义,然后调用默认实现。
  4. 如果变量的推断类型是类型,则调用该类型的实现。

因此,根据您的情况,您是说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方法。高温超导



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5010307.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存