Оба вызова печатают in TheClass: value является требованием протокола, и класс предоставляет его собственную реализацию.
Что будет выведено в примере №39
Оба вызова печатают in TheClass: value является требованием протокола, и класс предоставляет его собственную реализацию.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В этом фрагменте кода демонстрируется, как работает переопределение свойства, объявленного в протоколе, когда у протокола есть реализация по умолчанию в расширении, а класс‑конформер предоставляет собственную реализацию. Сравнивается вывод свойства при обращении к объекту через его конкретный тип и через тип протокола.
protocol TheProtocol {
var value: String { get }
}
extension TheProtocol {
var value: String {
return "in TheProtocol"
}
}
class TheClass: TheProtocol {
var value: String {
return "in TheClass"
}
}
let theClass = TheClass()
let theProtocol: TheProtocol = theClass
print(theClass.value) // ?
print(theProtocol.value) // ?
Ожидаемый результат: оба вызова печатают "in TheClass".
Ответ
Оба вызова печатают in TheClass: value является требованием протокола, и класс предоставляет его собственную реализацию.
При обращении через конкретный тип используется свойство TheClass. При обращении через протокольную переменную вызывается witness реализации требования, также предоставленный TheClass. Default в extension нужен, если соответствующий тип не реализует требование сам. Это отличается от случая, когда value объявлено только в extension, но отсутствует в самом протоколе: тогда выбор через протокольный статический тип не имеет такого полиморфизма.