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 の両方に一致する実装を提供しないと、コンパイル時エラーが発生します。これを回避できる方法はありますか?
ありがとう。