Что происходит в Swift, когда протокол вынужден наследовать от класса?
Первый: код ошибки:
class AA { }
protocol Action where Self: AA {
func method1()
func method2()
}
extension Action {
func method1() {
print("method1")
}
}
class List: AA, Action {
func method2() {
print("List method2")
}
}
class Detail: AA, Action {
func method2() {
print("Detail method2")
}
}
let controllers = [List(), Detail()] as [Any]
if let action = controllers.first as? Action {
action.method2() //error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0x2).
}
тогда правильный код, все работает нормально:
protocol Action {
func method1()
func method2()
}
extension Action where Self: AA {
func method1() {
print("method1")
}
}
Вопрос 1: что происходит, когда протокол вынужден наследовать от класса?
Вопрос 2: В чем разница между правильным и неправильным кодом?
1 ответ
Протокол не может наследоваться от класса.
Однако вы можете предоставить реализации по умолчанию для методов протокола, если реализующий класс соответствует некоторым условиям. where
Статья определяет такие условия.
Этот код:
extension Action where Self: AA {
func method1() {
print("method1")
}
}
обеспечивает реализацию по умолчанию для method1()
протокола Action
в классе AA
,
Следующее не имеет смысла:
protocol Action where Self: AA {
func method1()
func method2()
}
Вы не можете изменить протокол для определенного класса.