Ответ
Расширения в Swift мощны, но имеют ряд важных ограничений, направленных на сохранение безопасности и предсказуемости типа.
Основные ограничения:
-
Нельзя добавлять stored properties. Можно добавлять только computed properties, методы, инициализаторы, сабскрипты и вложенные типы.
extension Double { var km: Double { return self * 1000.0 } // Computed - OK // let storedValue = 10 // Ошибка: Stored property not supported } -
Нельзя добавлять designated инициализаторы или деинициализаторы (
deinit) внутри расширений для классов. Можно добавлять только convenience инициализаторы. -
Нельзя добавлять наблюдателей свойств (
willSet/didSet) к существующим свойствам в расширении. Их можно добавить только в основном объявлении типа. -
Нельзя переопределять существующие методы/свойства (без модификатора
@objc). Расширения добавляют новую функциональность, а не изменяют существующую. Исключение — расширения протоколов с реализацией по умолчанию. -
Расширения не поддерживают наследование. Вы не можете написать
extension SubClass: SomeProtocol, объявление соответствия протоколу должно быть в основном теле класса или в его расширении. -
Доступ к
privateчленам возможен только если расширение объявлено в том же файле.
Практическое следствие:
Эти ограничения делают расширения идеальными для:
- Организации кода (протокол-ориентированное программирование).
- Добавления удобных методов-помощников.
- Реализации методов по умолчанию для протоколов.
- Разделения реализации на логические блоки.
Они не предназначены для фундаментального изменения поведения или состояния существующего типа.