Какие переменные можно хранить в Swift extension?

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

Ответ

В extension можно добавлять только вычисляемые свойства (computed properties), но нельзя добавлять хранимые свойства (stored properties). Это ограничение связано с тем, что расширения не могут изменять структуру существующего типа в памяти.

Пример вычисляемых свойств в extension:

extension Double {
    var km: Double { return self * 1000.0 }
    var m: Double { return self }
    var cm: Double { return self / 100.0 }
}

let distance: Double = 5.0
print(distance.km) // 5000.0

Также можно добавлять статические вычисляемые свойства:

extension Int {
    static var maxSafeValue: Int { Int.max / 2 }
}

Почему нельзя stored properties? Расширение не имеет места для хранения нового поля. Для эмуляции хранимых свойств в классах можно использовать механизм associated objects из Objective-C runtime, но это считается антипаттерном в чистом Swift и нарушает типобезопасность.