Какой результат печати у Swift‑кода №26

Оба вызова напечатают Cat: say() объявлен требованием Animal, а класс Cat реализует его самостоятельно.

Короткий ответ

Что ответить на собеседовании

Оба вызова напечатают Cat: say() объявлен требованием Animal, а класс Cat реализует его самостоятельно.

Подробный разбор

Ответ с пояснениями

Условие

В этом примере демонстрируется, как работает протокольный метод с реализацией по умолчанию и его переопределение в конкретном классе. Обратите внимание, что переменная объявлена как тип протокола, а затем вызываются методы как у протокола, так и у класса‑реализации.

protocol Animal {
    func say()
}

extension Animal {
    func say() {
        print("Animal")
    }
}

class Cat: Animal {
    func say() {
        print("Cat")
    }
}

let cat: Animal = Cat()
cat.say()
Cat().say()

Ответ

Оба вызова напечатают Cat: say() объявлен требованием Animal, а класс Cat реализует его самостоятельно.

Протокольный тип переменной cat не удаляет информацию о реализации требования. Его вызов использует соответствие Cat протоколу Animal, а прямой Cat().say() обращается к тому же методу класса. Extension Animal предоставляет default, который использовался бы у типа без своего say. Если метод не был бы требованием протокола, а существовал только в extension, сравнение диспетчеризации было бы другим.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее