试图了解 Swift 中面向协议的编程以及扩展如何工作以及它可以提供什么级别的可扩展性。
有以下我在 Playgrounds 中运行的代码片段
protocol ProtocolA {
func doSomethingA()
}
protocol ProtocolB {
func doSomethingB()
}
protocol ProtocolC {
func doSomethingC()
}
extension ProtocolA {
func doSomethingA() {
print("Extension - doSomethingA")
}
}
extension ProtocolA where Self: ProtocolB {
func doSomethingA() {
print("Extension - doSomethingA Self: ProtocolB")
}
}
extension ProtocolA where Self: ProtocolC {
func doSomethingA() {
print("Extension - doSomethingA Self: ProtocolC")
}
}
extension ProtocolA where Self: ProtocolB, Self: ProtocolC {
func doSomethingA() {
print("Extension - doSomethingA Self: ProtocolB, ProtocolC")
}
}
extension ProtocolB {
func doSomethingB() {
print("Extension - doSomethingB")
}
}
extension ProtocolC {
func doSomethingC() {
print("Extension - doSomethingC")
}
}
class Implementation: ProtocolA, ProtocolB, ProtocolC {
}
let obj = Implementation()
obj.doSomethingA()
我打印的是:
Extension - doSomethingA Self: ProtocolB, ProtocolC
无论如何,我可以保证所有扩展都运行。
理想情况下,我想获得以下输出。
Extension - doSomethingA
Extension - doSomethingA Self: ProtocolB
Extension - doSomethingA Self: ProtocolC
Extension - doSomethingA Self: ProtocolB, ProtocolC
我确实理解 Swift 会根据其类型选择最强匹配,事实上,如果我不提供 ProtocolA 与 ProtocolB 和 ProtocolC 匹配的实现,我会得到一个编译时错误。无论如何我可以解决这个问题吗?
谢谢。