Что выведет код Middle Протоколы, POP и дженерики спрашивают часто обновлено

Что выведет Swift: требование протокола и метод расширения

Вопрос

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

protocol Greeter { func hello() -> String }

extension Greeter {
    func hello() -> String { "протокол" }
    func bye() -> String { "пока из протокола" }
}

struct Robot: Greeter {
    func hello() -> String { "робот" }
    func bye() -> String { "пока от робота" }
}

let a: any Greeter = Robot()
let b = Robot()
print(a.hello())
print(a.bye())
print(b.bye())

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

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

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

Коротко

Код выведет: робот, пока из протокола, пока от робота. hello это требование протокола, вызывается реализация Robot через witness table. bye есть только в расширении, для any Greeter выбирается статически версия расширения.

Что выведет

робот
пока из протокола
пока от робота

Разбор

hello это требование протокола, вызывается реализация Robot через witness table. bye есть только в расширении, для any Greeter выбирается статически версия расширения. У b статический тип Robot, поэтому его собственный bye.

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

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