我遇到了一个问题,下面的代码(Swift 3.1)对其进行了解释:
protocol MyProtocol {
func methodA()
func methodB()
}
extension MyProtocol {
func methodA() {
print("Default methodA")
}
func methodB() {
methodA()
}
}
// Test 1
class BaseClass: MyProtocol {
}
class SubClass: BaseClass {
func methodA() {
print("SubClass methodA")
}
}
let object1 = SubClass()
object1.methodB()
//
// Test 2
class JustClass: MyProtocol {
func methodA() {
print("JustClass methodA")
}
}
let object2 = JustClass()
object2.methodB()
//
// Output
// Default methodA
// JustClass methodA
我预期"子类的methodA"文字应该在调用object1.methodB()
之后打印出来。但由于某些原因,协议扩展的默认实现methodA()
被调用了。然而object2.methodB()
的调用效果与预期相同。
这是Swift协议方法分派中的另一个bug还是我遗漏了什么,代码正常工作?
func methodB() { methodA(); }
}class BaseClass: MyProtocol {}。话虽如此,一旦你子类化,PWT不会重新映射,而是每次重写(
class SubClass : BaseClass{ func methodA() { print("subClass methodA") } }`)。 - mfaani