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

«Как объявлять и использовать переменные уровня класса (class variables) в Swift?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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. Синглтон: Для сложного состояния и инкапсуляции логики инициализации.