Что будет выведено в примере №39

Оба вызова печатают in TheClass: value является требованием протокола, и класс предоставляет его собственную реализацию.

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

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

Оба вызова печатают 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, но отсутствует в самом протоколе: тогда выбор через протокольный статический тип не имеет такого полиморфизма.

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

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

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

Подробнее