Что такое extension в Swift и каковы его ограничения?

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

Ответ

Extension (расширение) в Swift позволяет добавлять новую функциональность к существующему классу, структуре, перечислению или протоколу без изменения их исходного кода и без использования наследования.

Что можно добавлять в extension:

  • Вычисляемые свойства (computed properties).
  • Методы (экземпляра и типа).
  • Новые инициализаторы (convenience init).
  • Сабскрипты.
  • Вложенные типы.
  • Реализацию протоколов.

Пример:

extension String {
    // Добавляем метод экземпляра
    var isPalindrome: Bool {
        let cleaned = self.lowercased().filter { $0.isLetter }
        return cleaned == String(cleaned.reversed())
    }

    // Добавляем метод типа (static)
    static func random(length: Int) -> String {
        let letters = "abcdefghijklmnopqrstuvwxyz"
        return String((0..<length).map{ _ in letters.randomElement()! })
    }
}

print("radar".isPalindrome) // true
print(String.random(length: 5)) // "kqdjp"

Строгие ограничения extensions:

  1. Нельзя добавлять хранимые свойства (stored properties).
  2. Нельзя добавлять property observers к существующим свойствам.
  3. Нельзя переопределять существующую функциональность (для этого нужно использовать наследование в классах).
  4. Нельзя добавлять designated инициализаторы в классах, только convenience.

Практическое применение: Организация кода, разделение реализации протоколов, добавление вспомогательных методов к системным типам.