Типу нужно хранить одно общее значение для всех его экземпляров: какой механизм Swift подходит для этого?
Для общего состояния типа используют типовое свойство, объявленное с помощью static. Оно принадлежит самому типу, поэтому доступно через имя типа и существует независимо от конкретных экземпляров.
Свойство экземпляра хранит отдельное значение в каждом объекте, а типовое свойство предоставляет одно общее хранилище, связанное с типом.
В объектно-ориентированном программировании часто требуется разделять данные экземпляров и данные, относящиеся ко всему типу. Например, имя пользователя является состоянием конкретного объекта, а значение тайм-аута по умолчанию может быть общим для всех объектов.
Swift выражает это различие на уровне объявления: свойства экземпляра принадлежат экземплярам, а типовые свойства — метауровню типа. Такой подход не требует создавать специальный глобальный объект только для хранения общего значения.
Если общее значение ошибочно сделать свойством экземпляра, каждый объект получит собственную копию состояния. Изменение значения в одном экземпляре не повлияет на остальные, что может привести к рассинхронизации настроек или счётчиков.
Глобальная переменная решает задачу общего хранения, но ухудшает инкапсуляцию: её сложнее связать с конкретным типом, заменить в тестах и контролировать по области доступа. Типовое свойство сохраняет связь с владельцем и обращается через имя этого типа.
Типовое свойство объявляют с модификатором static. Обращение к нему выполняется через тип, а не через экземпляр. Для struct и enum типовое свойство может быть хранимым или вычисляемым.
Оба экземпляра используют одно значение CacheSettings.limit, потому что оно не входит в состояние first или second. Создание экземпляров для доступа к нему не требуется.
Изменяемое типовое свойство (static var) фактически является общим изменяемым состоянием. Это удобно для кэша, счётчика или значения по умолчанию, но создаёт скрытые зависимости между частями программы и требует учитывать конкурентный доступ.
Если значение не должно меняться, предпочтительнее static let. Для классов static запрещает переопределение типового члена, а class применяется к переопределяемым вычисляемым типовым свойствам и методам. Это различие важно, когда тип участвует в иерархии наследования.
Типовое свойство не является автоматически безопасным способом синхронизации. При совместной записи из разных потоков или задач нужно отдельно обеспечить корректную изоляцию и согласованность доступа.
Модулю сетевого клиента требуется общий тайм-аут по умолчанию для всех создаваемых запросов. Вариант со свойством экземпляра вынуждает передавать или синхронизировать значение в каждом объекте. Глобальная переменная проще, но скрывает владельца настройки и позволяет любому коду менять её без явной связи с клиентом.
Выбранное решение — типовое свойство настроек, например static let для неизменяемого значения или static var с ограниченным доступом на запись для изменяемой конфигурации. Это делает владельца состояния очевидным и позволяет обращаться к настройке до создания клиентов.
Если значение должно различаться между тестами, окружениями или пользователями, типовое свойство уже не лучший выбор: оно создаёт общее состояние процесса. В такой ситуации предпочтительнее передавать конфигурацию через инициализатор или зависимость, чтобы состояние было явным и изолированным.
Нет, типовые свойства в Swift предназначены для доступа через имя типа. Это подчёркивает, что значение относится не к конкретному экземпляру, а ко всему типу. Если значение логически зависит от состояния объекта, его следует сделать свойством экземпляра.
static отличается от class в объявлении члена класса?static делает типовой член невиртуальным: наследник не может его переопределить. class разрешает переопределение, но для свойств применяется к вычисляемым типовым свойствам, а не к хранимым. Поэтому выбор зависит от того, нужна ли полиморфная замена реализации в наследниках.
Все тесты и экземпляры типа видят одно и то же значение. Изменение, оставшееся после одного теста, может повлиять на другой, а параллельный доступ способен привести к гонкам данных. Для тестируемой бизнес-логики обычно лучше передавать конфигурацию явно, оставляя типовые свойства для действительно общего и контролируемого состояния.