Вывод — C: через переменную типа Test вызывается собственная реализация требования test() у Cat.
Какой вывод появится в консоли?
Вывод — C: через переменную типа Test вызывается собственная реализация требования test() у Cat.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой текст будет выведен в консоль и объясните причину.
protocol Test {
func test()
}
extension Test {
func test() {
print("A")
}
}
struct Cat: Test {
func test() {
print("C")
}
}
var a: Test = Cat()
a.test()
Ответ
Вывод — C: через переменную типа Test вызывается собственная реализация требования test() у Cat.
Метод присутствует в объявлении протокола, поэтому соответствие Cat хранит способ вызвать его реализацию. Наличие одноимённого метода в extension не заставляет existential-переменную игнорировать реализацию конкретного типа. Extension предоставляет default для случаев, где тип не реализует требование. Важна именно строка func test() внутри protocol Test: если оставить метод только в расширении, правила выбора изменятся.