Оба вызова напечатают Cat: say() объявлен требованием Animal, а класс Cat реализует его самостоятельно.
Какой результат печати у Swift‑кода №26
Оба вызова напечатают 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, сравнение диспетчеризации было бы другим.