Что делает ключевое слово `static` в Swift?

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

Ответ

Ключевое слово static в Swift объявляет члены типа (свойства и методы), которые принадлежат самому типу, а не какому-либо его экземпляру. Доступ к ним осуществляется через имя типа.

Основное использование:

class Logger {
    // Статическое свойство — общее для всего типа (аналог "классовой переменной")
    static let shared = Logger()
    static var logLevel: LogLevel = .info

    // Статический метод — вызывается на типе, а не на экземпляре
    static func log(_ message: String) {
        print("[\(logLevel)] \(message)")
    }

    private init() {} // Скрытый конструктор для синглтона
}

// Использование БЕЗ создания экземпляра класса Logger
Logger.logLevel = .debug
Logger.log("Приложение запущено") // Вывод: [debug] Приложение запущено

let loggerInstance = Logger.shared // Доступ к синглтону через static свойство

Важные детали:

  • В классах: Объявление с static является синонимом final class. Такие члены не могут быть переопределены в подклассах.
    class Vehicle {
        static func description() { print("Транспортное средство") }
        class func adjustableDescription() { print("Настраиваемое описание") } // Можно переопределить
    }
    class Car: Vehicle {
        // override static func description() { } // Ошибка компиляции: нельзя переопределить
        override class func adjustableDescription() { print("Автомобиль") } // OK
    }
  • В структурах и перечислениях: static используется без ограничений, так как эти типы не поддерживают наследование.
  • Область видимости: Статические свойства инициализируются лениво и гарантированно один раз (потокобезопасно), что делает их удобными для реализации синглтонов и shared-ресурсов.