Ответ
В Swift переменные уровня класса — это вычисляемые свойства. Они не хранят значение напрямую, а возвращают его при каждом обращении.
Объявление:
class MyClass {
// Статическое свойство (не переопределяется)
static var sharedConstant: Int {
return 42
}
// Ключевое слово `class` позволяет переопределение в подклассах
class var overridableValue: String {
return "Base"
}
}
class SubClass: MyClass {
override class var overridableValue: String {
return "Subclass"
}
}
Особенности и ограничения:
- Только вычисляемые: Не могут быть хранимыми (
stored properties) на уровне класса. - Потокобезопасность: Не гарантирована по умолчанию. Если свойство изменяемое (с сеттером), необходимо реализовать синхронизацию.
- Ленивая инициализация: Вычисляется при первом обращении.
Альтернативы для хранения состояния:
- Статические хранимые свойства в структурах или перечислениях:
enum AppSettings { static var apiKey: String = "default" // Хранимое свойство } - Синглтон: Для сложного состояния и инкапсуляции логики инициализации.
Ответ 18+ 🔞
Да ты посмотри, какая дичь, блядь! В Swift эти, сука, переменные уровня класса — они же на самом деле вычисляемые свойства, ёпта! Они как хитрая жопа — значения не держат, а каждый раз, когда ты к ним лезешь, они его тебе на ходу высирают.
Вот как это объявляется, смотри:
class MyClass {
// Статическое свойство (его переопределить нихуя нельзя)
static var sharedConstant: Int {
return 42
}
// А вот это ключевое слово `class` — оно уже позволяет подклассам нагло переписать всё на свой лад
class var overridableValue: String {
return "Base"
}
}
class SubClass: MyClass {
override class var overridableValue: String {
return "Subclass"
}
}
А теперь лови подводные ебучки и ограничения:
- Только вычисляемые, блядь! Сделать их хранимыми (
stored properties) на уровне класса — это как хуй с горы, нихуя не выйдет. - Потокобезопасность? Да похуй, не гарантирована! Если ты туда сеттер прилепил и значение меняется, то сам, блядь, думай, как синхронизацию впендюрить, а то все потоки в говне утонут.
- Ленивая инициализация: Работает — вычисляется только когда первый лох потянулся за значением.
Если тебе реально состояние хранить надо, а не просто вычислять, то вот тебе альтернативы, чтоб не выебываться:
- Статические хранимые свойства, но в структурах или перечислениях. Там можно.
enum AppSettings { static var apiKey: String = "default" // Вот это уже хранимое, нормальное свойство } - Синглтон, блядь! Если логика инициализации сложная, как мартышлюшка, и состояние нужно инкапсулировать — это твой выбор, чувак.