Какие ограничения есть у расширений (extension) в Swift?

«Какие ограничения есть у расширений (extension) в Swift?» — вопрос из категории Swift Core, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Расширения в Swift мощны, но имеют ряд важных ограничений, направленных на сохранение безопасности и предсказуемости типа.

Основные ограничения:

  1. Нельзя добавлять stored properties. Можно добавлять только computed properties, методы, инициализаторы, сабскрипты и вложенные типы.

    extension Double {
        var km: Double { return self * 1000.0 } // Computed - OK
        // let storedValue = 10 // Ошибка: Stored property not supported
    }
  2. Нельзя добавлять designated инициализаторы или деинициализаторы (deinit) внутри расширений для классов. Можно добавлять только convenience инициализаторы.

  3. Нельзя добавлять наблюдателей свойств (willSet/didSet) к существующим свойствам в расширении. Их можно добавить только в основном объявлении типа.

  4. Нельзя переопределять существующие методы/свойства (без модификатора @objc). Расширения добавляют новую функциональность, а не изменяют существующую. Исключение — расширения протоколов с реализацией по умолчанию.

  5. Расширения не поддерживают наследование. Вы не можете написать extension SubClass: SomeProtocol, объявление соответствия протоколу должно быть в основном теле класса или в его расширении.

  6. Доступ к private членам возможен только если расширение объявлено в том же файле.

Практическое следствие:

Эти ограничения делают расширения идеальными для:

  • Организации кода (протокол-ориентированное программирование).
  • Добавления удобных методов-помощников.
  • Реализации методов по умолчанию для протоколов.
  • Разделения реализации на логические блоки.

Они не предназначены для фундаментального изменения поведения или состояния существующего типа.