У меня возникла проблема с использованием расширений протокола Swift 2 с реализациями по умолчанию. Основная идея заключается в том, что я предоставил стандартную реализацию метода протокола, который я переопределяю в классе, который реализует протокол. Этот метод расширения протокола вызывается из базового класса, который затем вызывает метод, который я переопределял в производном классе. В результате переопределенный метод не вызывается.Расширение протокола Swift 2 не вызывает переопределенный метод правильно
Я попытался решить проблему до наименьшей возможной площадки, которая иллюстрирует проблему ниже.
protocol CommonTrait: class {
func commonBehavior() -> String
}
extension CommonTrait {
func commonBehavior() -> String {
return "from protocol extension"
}
}
class CommonThing {
func say() -> String {
return "override this"
}
}
class ParentClass: CommonThing, CommonTrait {
override func say() -> String {
return commonBehavior()
}
}
class AnotherParentClass: CommonThing, CommonTrait {
override func say() -> String {
return commonBehavior()
}
}
class ChildClass: ParentClass {
override func say() -> String {
return super.say()
// it works if it calls `commonBehavior` here and not call `super.say()`, but I don't want to do that as there are things in the base class I don't want to have to duplicate here.
}
func commonBehavior() -> String {
return "from child class"
}
}
let child = ChildClass()
child.say() // want to see "from child class" but it's "from protocol extension”
Я рекомендую вам прочитать этот пост здесь, чтобы понять, как это работает: http://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future – DevAndArtist