Как объявлять и использовать переменные уровня класса (class variables) в Swift?

Ответ

В 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) на уровне класса.
  • Потокобезопасность: Не гарантирована по умолчанию. Если свойство изменяемое (с сеттером), необходимо реализовать синхронизацию.
  • Ленивая инициализация: Вычисляется при первом обращении.

Альтернативы для хранения состояния:

  1. Статические хранимые свойства в структурах или перечислениях:
    enum AppSettings {
        static var apiKey: String = "default" // Хранимое свойство
    }
  2. Синглтон: Для сложного состояния и инкапсуляции логики инициализации.

Ответ 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) на уровне класса — это как хуй с горы, нихуя не выйдет.
  • Потокобезопасность? Да похуй, не гарантирована! Если ты туда сеттер прилепил и значение меняется, то сам, блядь, думай, как синхронизацию впендюрить, а то все потоки в говне утонут.
  • Ленивая инициализация: Работает — вычисляется только когда первый лох потянулся за значением.

Если тебе реально состояние хранить надо, а не просто вычислять, то вот тебе альтернативы, чтоб не выебываться:

  1. Статические хранимые свойства, но в структурах или перечислениях. Там можно.
    enum AppSettings {
        static var apiKey: String = "default" // Вот это уже хранимое, нормальное свойство
    }
  2. Синглтон, блядь! Если логика инициализации сложная, как мартышлюшка, и состояние нужно инкапсулировать — это твой выбор, чувак.