Ответ
Да, но с ограничениями. Нативно 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") } // Своя реализация
}