Пытаюсь разобраться в протокольно-ориентированном программировании в 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, я получу ошибку времени компиляции. Есть ли способ обойти это?
Спасибо.
obj.doSomethingA()
вы на самом деле хотите, чтобы он выполнял четыре разных процедуры. Так, как бы вы назвали супер.... четыре раза, ну три раза, по наследственной цепочке???? - person Fattie   schedule 02.07.2016