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