Вопрос проверяет понимание статической и динамической диспетчеризации методов в Swift.
Если метод объявлен только в extension протокола, используется реализация из этого extension.
Даже если тип имеет метод с таким же именем, он не будет вызван.
Вызов определяется на этапе компиляции.
Это называется статической диспетчеризацией.
Поведение методов в протоколах — одна из самых тонких тем Swift.
Метод, объявленный только в extension протокола, не является частью требований протокола.
Перед перечислением важно понять, через какой тип происходит вызов.
protocol Logger {}
extension Logger {
func log() {
print("protocol log")
}
}
struct FileLogger: Logger {
func log() {
print("struct log")
}
}
let logger: Logger = FileLogger()
logger.log()
Результат:
protocol log
Метод не объявлен в протоколе
Он не участвует в динамической диспетчеризации
Компилятор выбирает реализацию на этапе компиляции
Тип переменной (Logger) важнее конкретного объекта (FileLogger).
Методы, объявленные только в extension протокола, вызываются статически и всегда используют реализацию из extension.