错误的多个约束扩展实现称为

时间:2017-08-28 11:32:35

标签: swift swift-protocols

我正在实现一个如下组成的结构:

protocol ProtocolA {
  func doStuff()
}

protocol ProtocolB { }

extension ProtocolA {
  func doStuff() {
    print("From protocol A")
  }
}

extension ProtocolA where Self: ProtocolB {
   func doStuff() {
     print("From protocol B")
   }
}

我有以下课程:

class MyClassA: ProtocolA {
   func letsDoSomething() {
      self.doStuff()
   }
}

class MyClassB: MyClassA, ProtocolB {
}

会发生什么:

let ia = MyClassA()
ia.letsDoSomething() // From protocol A (OK!)

let ib = MyClassB()
ib.letsDoSomething() // From protocol A (Wrong!)

当然我不希望得到第二个答案。

正如Swift Programming Launguage指南中所述:

  

如果符合类型满足为同一方法或属性提供实现的多个约束扩展的要求,则Swift将使用与最专门的约束相对应的实现。

为什么符合ProtocolB 的班级ib不会调用最专业的扩展程序实现?

我知道调用类仍然是MyClassA,但由于实例来自MyClassB,它符合协议ProtocolB,我仍然希望能够调用最专业的实现

1 个答案:

答案 0 :(得分:1)

问题是MYClassB继承自MyClass A. Swift的方法调度规则从不调用此子类的实现,并且在协议一致性的情况下始终使用默认实现。尝试像这样的相同案例

class MyClassA: ProtocolA {
    func letsDoSomething() {
        self.doStuff()
    }
}

class MyClassB: ProtocolA, ProtocolB {
}


let ia = MyClassA()
ia.letsDoSomething() // From protocol A (OK!)

let ib = MyClassB()
ib.doStuff() // From protocol A (Wrong!)