Можно ли в extention определять хранимые свойства

Ответ

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

Пример:

extension UIView {
    // Вычисляемое свойство - допустимо
    var screenWidth: CGFloat {
        return UIScreen.main.bounds.width
    }

    // Ошибка: Хранимые свойства не поддерживаются
    // var tagString: String = "" 
}

Однако можно использовать ассоциированные объекты (associated objects) через Objective-C runtime для имитации хранимых свойств в расширениях.

Ответ 18+ 🔞

А, слушай, смотри, тут такая ебля с расширениями в свифте! В расширениях, блядь, нельзя воткнуть хранимое свойство, только вычисляемое. Это, сука, железное правило, потому что расширение — оно как бы поверхностное, не лезет в кишки типа, не меняет его структуру, а хранимое свойство — это ж память выделять надо, блядь!

Вот смотри, примерчик, чтобы не быть пиздаболом:

extension UIView {
    // Вычисляемое свойство — норм, работает
    var screenWidth: CGFloat {
        return UIScreen.main.bounds.width
    }

    // А вот так — НИЗЯ, блядь! Ошибка тебе в консоль плюнет!
    // var tagString: String = ""
}

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