Будет напечатано C: test() является требованием протокола, и Cat предоставляет собственную реализацию.
Что будет выведено в консоль (пример 2)
Будет напечатано C: test() является требованием протокола, и Cat предоставляет собственную реализацию.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой текст появится в выводе программы и объясните, почему именно он выводится.
protocol Test {
func test()
}
extension Test {
func test() { print("A") }
}
struct Cat: Test {
func test() { print("C") }
}
var obj: Test = Cat()
obj.test()
Ответ
Будет напечатано C: test() является требованием протокола, и Cat предоставляет собственную реализацию.
Экземпляр Cat упакован в переменную протокольного типа Test, но динамический вызов требования использует реализацию соответствия Cat. Метод из extension Test — реализация по умолчанию для типов без собственной версии. Чтобы получить A в таком примере, пришлось бы убрать реализацию Cat либо изменить сам контракт протокола; в исходной программе оснований выбирать default нет.