Чем отличается статическое (static) свойство от свойства экземпляра в Swift?

Ответ

Статическое свойство (static) принадлежит самому типу (классу, структуре, перечислению), а свойство экземпляра — конкретному экземпляру этого типа.

Критерий Статическое свойство (static var/let) Свойство экземпляра (var/let)
Принадлежность Типу. Существует в единственном экземпляре на весь тип. Экземпляру. У каждого объекта — своя копия.
Доступ Через имя типа: ClassName.propertyName. Через экземпляр: instance.propertyName.
Инициализация Доступно без создания экземпляра. Требует создания экземпляра.
Доступ к другим членам Может обращаться только к другим статическим членам. Может обращаться и к статическим, и к членам экземпляра.

Пример:

class NetworkManager {
    // Статическое свойство — общий для всех конфиг
    static let timeoutInterval: TimeInterval = 30.0
    static var activeRequestsCount = 0

    // Свойство экземпляра — уникально для каждого менеджера
    let sessionID: String
    var baseURL: String

    init(baseURL: String) {
        self.sessionID = UUID().uuidString
        self.baseURL = baseURL
        NetworkManager.activeRequestsCount += 1 // Обращение к static
    }
}

// Использование
print(NetworkManager.timeoutInterval) // 30.0 — доступ через тип
let manager = NetworkManager(baseURL: "https://api.example.com")
print(manager.baseURL) // "https://api.example.com" — доступ через экземпляр
print(NetworkManager.activeRequestsCount) // 1

Ключевое применение: static используется для общих констант, счетчиков, shared-инстансов (синглтонов) или конфигурации, общей для всех объектов типа.

Ответ 18+ 🔞

О, смотри-ка, народ опять путается в этих статиках! Ну ладно, разберём, как бабушка гречку перебирает.

Представь, что у тебя есть класс — ну, скажем, ПьяныйСтудент. Так вот:

Статическое свойство — это как общая водка на всю группу. Одна бутылка на всех, блядь. Кто первый пришёл — тот и царь. Она принадлежит самой идее пьянки, а не какому-то конкретному Васе.

Свойство экземпляра — это уже личная заначка каждого студента. У Васи — пачка «Беломора», у Пети — сигареты «Прима», а у Коли — только сопли. У каждого своё, епта.

Критерий Статик (static var/let) Обычное свойство (var/let)
Чьё это? Класса. Одно на всех, как общий унитаз в общаге. Экземпляра. У каждого свой горшок.
Как достучаться? Через имя класса: ПьяныйСтудент.общаяВодка. Через экземпляр: вася.личнаяЗаначка.
Когда рождается? Сразу, как только класс в память загрузили. Даже если ни одного студента нет. Только когда экземпляр создали (init).
С кем общается? Только с другими статиками. К обычным полям экземпляра не подпускают — они же не инициализированы ещё, ёпта! Может трогать и статики, и свои поля. Всем заправляет.

Ну, пример, чтобы совсем пиздец ясно стало:

class ПьяныйСтудент {
    // Статика — общая на всех
    static let лимитПьянокВНеделю = 3
    static var текущийСчётВБуфете = 0 // общий долг, блядь

    // Свойства экземпляра — у каждого свои
    let имя: String
    var степеньОпьянения: Int

    init(имя: String) {
        self.имя = имя
        self.степеньОпьянения = 0
        ПьяныйСтудент.текущийСчётВБуфете += 500 // долг растёт на всех!
    }
}

// Использование
print(ПьяныйСтудент.лимитПьянокВНеделю) // 3 — спросили у класса
let вася = ПьяныйСтудент(имя: "Вася")
print(вася.степеньОпьянения) // 0 — спросили у Васи
print(ПьяныйСтудент.текущийСчётВБуфете) // 500 — общий счёт попёр вверх

Короче, суть: static — это когда надо что-то одно на всех, как общий кошелёк, счётчик или конфиг. А обычное свойство — это личные трусы, которые каждый сам себе стирает. Выбирай, что тебе надо, а то опять в статиках запутаешься, как хуй в проруби.