Какой вывод получим в примере №40

Вывод: in TheClass, затем in TheProtocol. Свойство value не объявлено требованием протокола, поэтому через протокольный тип выбирается extension.

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

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

Вывод: 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 для требования.

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

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

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

Подробнее