Что такое опциональные требования (optional requirements) в протоколе Swift?

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

Ответ

Опциональные требования — это методы или свойства в протоколе, реализация которых не является обязательной для соответствующего типа. Это механизм, унаследованный от взаимодействия с Objective-C.

Ключевые особенности и синтаксис:

  1. Требуется атрибут @objc. Протокол должен быть помечен как @objc, и сами опциональные требования тоже.
  2. Работают только с классами. Структуры и перечисления не могут соответствовать @objc протоколам.
  3. Объявление: Требование помечается модификаторами @objc и optional.

Пример:

// 1. Объявляем протокол с опциональным методом
@objc protocol DataSourceDelegate {
    func requiredMethod() // Обязательное требование
    @objc optional func optionalMethod(data: String) // Опциональное требование
}

// 2. Класс реализует протокол
class MyDelegate: DataSourceDelegate {
    // Реализуем только обязательный метод
    func requiredMethod() {
        print("Required method called")
    }
    // optionalMethod(data:) реализовывать НЕ ОБЯЗАТЕЛЬНО
}

// 3. Использование с опциональной цепочкой вызовов
let delegate: DataSourceDelegate = MyDelegate()
delegate.requiredMethod() // Вызовется гарантированно

// Вызов опционального метода. Если он не реализован, ничего не произойдет.
delegate.optionalMethod?(data: "test") // Вызов через опциональную цепочку `?`

Когда использовать? В основном для обратной совместимости с Objective-C API (например, многие делегаты UIKit/AppKit) или в сценариях, где лишь некоторые из множества методов делегата действительно нужны конкретному классу.

Важная альтернатива в чистом Swift: Вместо опциональных требований часто используют разделение протоколов на несколько мелких (принцип разделения интерфейсов — ISP) или предоставляют реализации по умолчанию через расширения протоколов (protocol extensions).