я нашел интересное поведение, которое кажется как ошибка ...Swift расширение протокола способ доставки с суперкласса и подкласса
На основе поведения описаны в следующих статьях:
https://medium.com/ios-os-x-development/swift-protocol-extension-method-dispatch-6a6bf270ba94
http://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future
Выход не является тем, что я ожидаю, когда добавляю SomeSuperclass
, а не напрямую принимаю протокол.
protocol TheProtocol {
func method1()
}
extension TheProtocol {
func method1() {
print("Called method1 from protocol extension")
}
func method2NotInProtocol() {
print("Called method2NotInProtocol from protocol extension")
}
}
// This is the difference - adding a superclass
class SomeSuperclass: TheProtocol {
}
// It works as expected when it simply adopts TheProtocol, but not when it inherits from a class that adopts the protocol
class MyClass: SomeSuperclass {
func method1() {
print("Called method1 from MyClass implementation")
}
func method2NotInProtocol() {
print("Called method2NotInProtocol from MyClass implementation")
}
}
let foo: TheProtocol = MyClass()
foo.method1() // expect "Called method1 from MyClass implementation", got "Called method1 from protocol extension"
foo.method2NotInProtocol() // Called method2NotInProtocol from protocol extension
Знаете ли вы, если это ошибка или по дизайну? Один из коллег предположил, что смешение наследования и расширений протоколов может работать не так, как ожидалось. Я собирался использовать расширение протокола, чтобы обеспечить реализацию по умолчанию ... если я не могу этого сделать, то, к сожалению, мне придется отметить его @objc
и вернуться к необязательному протоколу.
Возможный дубликат [Способ распространения расширения протокола в Swift 2.0] (http://stackoverflow.com/questions/32734403/protocol-extension-method-dispatch-in-swift-2-0) – mbelsky