Что происходит в 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()
}

Вы не можете изменить протокол для определенного класса.

Другие вопросы по тегам