Ответ
В 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 — для логики, а не для барахла. Всё, вопрос закрыт.