Что такое имплементация по умолчанию (default implementation) в контексте протоколов Swift и когда она применяется?

«Что такое имплементация по умолчанию (default implementation) в контексте протоколов Swift и когда она применяется?» — вопрос из категории Other, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Имплементация по умолчанию — это реализация метода или свойства протокола, предоставляемая в его 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 (из структуры)
}

Ключевой вывод: Имплементация по умолчанию — это инструмент для уменьшения дублирования кода и предоставления базовой функциональности, которую тип может переопределить при необходимости.