Зачем использовать расширения (extensions) для протоколов в Swift?

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

Ответ

Расширения протоколов (extension Protocol) позволяют добавлять реализацию по умолчанию для методов, вычисляемых свойств, сабскриптов и инициализаторов, не изменяя исходное объявление протокола.

Основные цели:

  1. Реализация по умолчанию: Типы, соответствующие протоколу, автоматически получают эту реализацию, но могут её переопределить.
  2. Расширение существующих протоколов: Добавление нового функционала к протоколам из стандартной библиотеки или сторонних фреймворков.
  3. Ограничение расширений: Добавление методов только для определённых типов с помощью условия where.

Пример:

protocol Renderable {
    func draw()
}

// Добавляем реализацию по умолчанию
extension Renderable {
    func draw() {
        print("Rendering a default shape.")
    }
    // Добавляем новый метод ко всем соответствующим типам
    func highlight() {
        print("Shape is highlighted.")
    }
}

struct Circle: Renderable {} // Автоматически получает draw() и highlight()
Circle().draw() // Вывод: "Rendering a default shape."

struct Square: Renderable {
    func draw() { // Переопределение реализации по умолчанию
        print("Rendering a square.")
    }
}