Может ли функция в протоколе Swift быть необязательной (optional)?

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

Ответ

Да, но с ограничениями. Нативно Swift-протоколы требуют реализации всех членов. Необязательные методы требуют подхода @objc.

1. Через @objc (Objective-C совместимость):

  • Протокол и метод помечаются как @objc.
  • Протокол могут принимать только классы (не структуры или перечисления).

    @objc protocol DataSource {
        func requiredMethod()
        @objc optional func optionalMethod() // Необязательный метод
    }
    
    class MyDataSource: DataSource {
        func requiredMethod() { /* Обязательная реализация */ }
        // optionalMethod() можно не реализовывать
    }
    
    // Вызов с опциональной цепочкой
    let source = MyDataSource()
    source.optionalMethod?()

2. Нативный Swift-подход (рекомендуется): Используйте расширения протокола (protocol extension) для предоставления реализации по умолчанию. Метод становится "условно обязательным" — тип может использовать реализацию по умолчанию или предоставить свою.

    protocol Renderable {
        func draw()
    }
    // Реализация по умолчанию
    extension Renderable {
        func draw() { print("Default drawing") }
    }

    struct Circle: Renderable {} // Использует draw() по умолчанию
    struct Square: Renderable {
        func draw() { print("Drawing a square") } // Своя реализация
    }