Где хранятся статические (`static`) переменные в Swift и каков их жизненный цикл?

«Где хранятся статические (`static`) переменные в Swift и каков их жизненный цикл?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Статические переменные (объявленные с ключевым словом static) хранятся в области памяти, называемой сегментом данных (Data Segment/BSS). Это память, выделяемая при запуске приложения и существующая до его завершения.

Ключевые характеристики:

  • Время жизни: Существуют на протяжении всей работы программы. Инициализируются один раз (лениво, при первом обращении, если не указано иное).
  • Область видимости: Ограничена областью видимости типа (класса, структуры, перечисления), в котором они объявлены.
  • Потокобезопасность: Инициализация по умолчанию потокобезопасна в Swift.

Примеры и использование:

  1. Статическое свойство типа:

    class AppSettings {
        static let version = "1.0.0" // Хранится в data segment
        static var launchCount = 0   // Хранится в data segment, значение сохраняется между запусками (если его записать в UserDefaults)
    }
    print(AppSettings.version) // Обращение через имя типа
  2. Локальная статическая переменная в функции:

    func generateUniqueID() -> Int {
        static var counter = 0 // Хранится в data segment, но видима только внутри этой функции
        counter += 1
        return counter
    }
    print(generateUniqueID()) // 1
    print(generateUniqueID()) // 2 // Значение сохраняется между вызовами!
  3. class для вычисляемых свойств в классах (только для классов):

    class AbstractShape {
        class var defaultColor: String { return "black" } // Может быть переопределен в подклассе
        static let immutableID = "SHAPE" // Не может быть переопределен
    }

Важное отличие от глобальных переменных: Статические переменные инкапсулированы внутри типа, что предотвращает загрязнение глобального пространства имен и улучшает организацию кода.