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

Ответ

В 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 и нарушает типобезопасность.

Ответ 18+ 🔞

А, ну ты смотри, какой умный пришёл! Хочешь в extension запихнуть хранимое свойство, да? Ну, блядь, мечтать не вредно, конечно.

Слушай сюда, объясняю на пальцах, а то у тебя там, вижу, волнение ебать. 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 } // Тоже вычисляемое, ёпта!
}

А теперь главное, почему нельзя просто взять и добавить var myProperty: String = "hello". Потому что, блядь, расширению негде это хранить! У типа уже есть чёткий план памяти, как солдаты в строю. Ты не можешь прийти и крикнуть: "А теперь все шаг вправо, я Петьку с бутылкой водки в середину вставлю!". Не выйдет, всех собьёшь.

Ну а если прям овердохуища надо, и плевать на чистоту Swift, то есть грязный хак из мира Objective-C — associated objects. Это как привязать свою сумку к чужому забору проволокой. Вроде твоё, но забору от этого пиздец как неловко, и типобезопасность вся к чертям. Настоящие мужики на такое не идут, это для мартышлюшек.

Короче, запомни: extension — для логики, а не для барахла. Всё, вопрос закрыт.