Что выведет код 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 ошибок.
Предыдущий вопрос
Какой вызов как диспетчеризуется
Следующий вопрос
Что выведет Swift: перегрузка и дженерик
Термины по теме
Ещё по теме «Протоколы, POP и дженерики»
- Протокол делегата и weak
- Протокол с associatedtype как тип параметра
- Условное соответствие протоколу
- Метод из расширения протокола: какая реализация вызовется
- Ограничение дженерика Comparable
- Как ускорить вызов методов класса
- Что такое associatedtype
- Виды диспетчеризации в Swift