Что выведет код Senior Протоколы, POP и дженерики обновлено

Что выведет Swift: подкласс и реализация по умолчанию

Вопрос

Что выведет код?

protocol Named { func name() -> String }
extension Named { func name() -> String { "default" } }

class Base: Named {}
class Child: Base {
    func name() -> String { "child" }
}

let x: any Named = Child()
print(x.name())
print(Child().name())

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: default, child. Соответствие Named объявил Base, и в его witness table попала реализация по умолчанию из расширения: у Base своего метода нет.

Что выведет

default
child

Разбор

Соответствие Named объявил Base, и в его witness table попала реализация по умолчанию из расширения: у Base своего метода нет. Child.name() не переопределение (в Base переопределять нечего), поэтому через протокол вызывается default. Лечится реализацией name() в Base и override в Child.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.