Можно ли предоставить реализацию метода по умолчанию в протоколе Swift?

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

Ответ

Да, начиная с Swift 2, можно предоставить реализацию по умолчанию для методов и вычисляемых свойств протокола с помощью расширения протокола (protocol extension).

protocol Vehicle {
    var fuelLevel: Double { get }
    func startEngine()
}

// Расширение протокола с реализацией по умолчанию
extension Vehicle {
    // Реализация метода по умолчанию
    func startEngine() {
        print("Engine started for a generic vehicle.")
    }

    // Вычисляемое свойство по умолчанию
    var isFuelLow: Bool {
        return fuelLevel < 0.1
    }
}

struct Car: Vehicle {
    var fuelLevel: Double
    // Метод startEngine() не реализован — используется версия по умолчанию
}

let myCar = Car(fuelLevel: 0.5)
myCar.startEngine() // Выводит: "Engine started for a generic vehicle."
print(myCar.isFuelLow) // Выводит: false

Важные детали:

  1. Переопределение: Тип, соответствующий протоколу, может предоставить свою собственную реализацию, которая будет иметь приоритет над реализацией по умолчанию.
  2. Ограничения: Реализация по умолчанию не может добавлять stored properties или новые требования к протоколу.
  3. Специализация: Можно создавать расширения с ограничениями where для предоставления реализаций по умолчанию только определенным типам.
    extension Vehicle where Self: Electric {
    func startEngine() { print("Silent electric engine started.") }
    }