我在协议扩展中给出了一些默认的实现代码。但是如何在符合协议的类中调用此指定代码。这是一个例子:
class BaseClass {}
protocol ImplementedProtocol {
func printInfo()
}
extension ImplementedProtocol where Self: BaseClass {
func printInfo() {
print("Hello! This is ImplementedProtocol")
}
}
class SuperClass: BaseClass, ImplementedProtocol {
func printInfo() {
// I should do sth here.
print("Hello! This is SuperClass")
}
}
class SubClass: SuperClass {
override func printInfo() {
super.printInfo()
print("This is SubClass")
}
}
let a = SubClass()
a.printInfo() // I get "Here is SuperClass. Here is SubClass."
// But I want "Here is ImplementedProtocol. Here is SuperClass. Here is SubClass."
Run Code Online (Sandbox Code Playgroud)
协议更像是编译时保证类型具有某些方法和属性。默认实现通过向协议采用者注入实现而增加了另一层复杂性。我没有能力浏览 Swift 的源代码,但我认为当采用者提供自己的实现时,默认实现就会黯然失色,并且无法将其恢复。
解决方法是向协议中添加一个具有不同名称的方法,该方法提供默认实现并且可以由任何采用者调用:
protocol ImplementedProtocol {
func printInfo()
func defaultPrintInfo()
}
extension ImplementedProtocol where Self: BaseClass {
func printInfo() {
defaultPrintInfo()
}
func defaultPrintInfo() {
print("Hello! This is ImplementedProtocol")
}
}
class SuperClass: BaseClass, ImplementedProtocol {
func printInfo() {
self.defaultPrintInfo()
print("Hello! This is SuperClass")
}
}
Run Code Online (Sandbox Code Playgroud)