Ответ
Статическое свойство (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 — это когда надо что-то одно на всех, как общий кошелёк, счётчик или конфиг. А обычное свойство — это личные трусы, которые каждый сам себе стирает. Выбирай, что тебе надо, а то опять в статиках запутаешься, как хуй в проруби.