Ответ
Расширения протоколов — ключевой инструмент Protocol-Oriented Programming. В них можно добавить:
-
Реализацию по умолчанию для требований протокола:
protocol Renderable { func render() } extension Renderable { func render() { // Дефолтная реализация print("Rendering...") } } struct Button: Renderable {} // Автоматически получает render() -
Новые методы и вычисляемые свойства, не объявленные в протоколе:
extension Collection { var isNotEmpty: Bool { // Новое свойство return !isEmpty } func printAll() { // Новый метод for element in self { print(element) } } } -
Ограниченные расширения с помощью
where:extension Collection where Element: Numeric { func sum() -> Element { return reduce(0, +) } } [1, 2, 3].sum() // 6 -
Инициализаторы (кроме required инициализаторов протокола):
protocol Configurable { init(from config: String) } extension Configurable { init(from config: String) { // Общая логика инициализации self.init() // Вызов memberwise init } }
Ограничения: В расширении протокола нельзя:
- Добавлять хранимые свойства (
stored properties). - Добавлять
@objc-методы (если протокол не помечен как@objc). - Переопределять методы, уже реализованные в конкретном типе (в отличие от наследования классов).