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