Что можно реализовать в расширении (extension) протокола в Swift?

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

Ответ

Расширения протоколов — ключевой инструмент Protocol-Oriented Programming. В них можно добавить:

  1. Реализацию по умолчанию для требований протокола:

    protocol Renderable {
        func render()
    }
    
    extension Renderable {
        func render() { // Дефолтная реализация
            print("Rendering...")
        }
    }
    
    struct Button: Renderable {} // Автоматически получает render()
  2. Новые методы и вычисляемые свойства, не объявленные в протоколе:

    extension Collection {
        var isNotEmpty: Bool { // Новое свойство
            return !isEmpty
        }
    
        func printAll() { // Новый метод
            for element in self { print(element) }
        }
    }
  3. Ограниченные расширения с помощью where:

    extension Collection where Element: Numeric {
        func sum() -> Element {
            return reduce(0, +)
        }
    }
    
    [1, 2, 3].sum() // 6
  4. Инициализаторы (кроме required инициализаторов протокола):

    protocol Configurable {
        init(from config: String)
    }
    
    extension Configurable {
        init(from config: String) {
            // Общая логика инициализации
            self.init() // Вызов memberwise init
        }
    }

Ограничения: В расширении протокола нельзя:

  • Добавлять хранимые свойства (stored properties).
  • Добавлять @objc-методы (если протокол не помечен как @objc).
  • Переопределять методы, уже реализованные в конкретном типе (в отличие от наследования классов).