Ответ
Имплементация по умолчанию — это реализация метода или свойства протокола, предоставляемая в его extension. Она используется, если соответствующий тип, подписанный на протокол, не предоставляет своей собственной реализации.
Когда происходит выбор имплементации? Выбор между реализацией по умолчанию и кастомной реализацией типа происходит на этапе компиляции (статическая диспетчеризация) для методов, объявленных в расширении протокола. Это не то же самое, что динамическая диспетчеризация через таблицу виртуальных функций (vtable) для методов класса.
Пример и важный нюанс:
protocol Renderable {
func draw()
}
extension Renderable {
// Имплементация по умолчанию
func draw() { print("Default drawing") }
}
struct Square: Renderable {
// У Square НЕТ своей реализации draw()
}
struct Circle: Renderable {
// У Circle ЕСТЬ своя реализация
func draw() { print("Drawing a circle") }
}
let shapes: [Renderable] = [Square(), Circle()]
for shape in shapes {
shape.draw() // Вызовется ТА реализация, которая известна на момент компиляции для каждого типа.
// Square.draw() -> Default drawing (из extension)
// Circle.draw() -> Drawing a circle (из структуры)
}
Ключевой вывод: Имплементация по умолчанию — это инструмент для уменьшения дублирования кода и предоставления базовой функциональности, которую тип может переопределить при необходимости.