在Swift中使用子协议中的父协议默认函数实现

时间:2017-12-07 13:09:17

标签: swift protocols

我正在寻找一种子类化协议的方法,并使用默认实现来调用基本函数。

让我们说出以下结构:

// My base protocol
protocol BaseProcotol {
  func display(message: String)
}

extension BaseProcotol {
  func display(message: String) {
    print(message)
  }
}

// The sub protocol
protocol SubProtocol : BaseProtocol { }

extension SubProtocol {
  func display(message: String) {
    display(message) // <- I cannot call the default BaseProcotol implem! 
    print("This message was sent from sub protocol.")
  }
}

在以下架构中,我无法正确管理SubProtocol函数display(message:)因为SubProtocol函数调用自身而不是BaseProcotol函数导致无限循环

我尝试使用类似的东西:

extension SubProtocol {
  func display(message: String) {
    (self as BaseProtocol).display(message) // <- Still the same issue...
    print("This message was sent from sub protocol.")
  }
}

但它没有用......

我发现这样做的唯一方法是添加一个像这样的新函数的非优雅解决方案:

// The sub protocol
protocol SubProtocol : BaseProtocol { 
  func displaySubProtocol(message: String)
}

extension SubProtocol {
  func displaySubProtocol(message: String) {
    display(message) // <- works, call the BaseProtocol default implementation 
    print("This message was sent from sub protocol.")
  }
}

但是你可以看到我必须添加另一个函数,如果一个类采用SubProtocol它可以调用BaseProtocol函数...

什么方法可以做得好?

0 个答案:

没有答案