Что такое reference types
Reference type (ссылочный тип) в Swift — это тип, переменная которого хранит не сами данные, а ссылку (указатель) на область памяти, где эти данные расположены. При присваивании такой переменной другой переменной копируется только ссылка, а не данные, поэтому обе переменные указывают на один и тот же объект в памяти.
Как это работает
В Swift все типы делятся на value types (значимые) и reference types (ссылочные). К ссылочным типам относятся классы (class), функции и замыкания. Когда вы создаёте экземпляр класса, в памяти выделяется область для хранения его свойств, а переменная получает адрес этой области. При присваивании let obj2 = obj1 копируется только адрес, поэтому obj1 и obj2 ссылаются на один и тот же объект. Изменение свойств через любую из переменных отражается на общем объекте.
Пример
class Person {
var name: String
init(name: String) {
self.name = name
}
}
let person1 = Person(name: "Alice")
let person2 = person1 // копируется ссылка, а не объект
person2.name = "Bob"
print(person1.name) // "Bob" — объект общий
print(person2.name) // "Bob"
В этом примере `person1` и `person2` указывают на один и тот же экземпляр `Person`. Изменение через `person2` меняет данные, видимые через `person1`.
## Отличия от value types
| Характеристика | Value type (например, `struct`, `enum`) | Reference type (например, `class`) |
|----------------|----------------------------------------|-----------------------------------|
| Хранение данных | Хранит сами данные в переменной | Хранит ссылку на данные в памяти |
| При присваивании | Копируется значение (глубокая копия) | Копируется ссылка (указатель) |
| Изменения | Не влияют на другие переменные | Влияют на все переменные, ссылающиеся на объект |
| Память | Обычно на стеке | В куче (heap) |
| Идентичность | Нет понятия идентичности | Есть понятие идентичности (===) |
## Подводные камни
- **Неожиданные изменения**: из-за общего состояния изменение через одну переменную влияет на другие, что может привести к трудноуловимым багам.
- **Управление памятью**: ссылочные типы требуют подсчёта ссылок (ARC). При наличии циклических ссылок возможна утечка памяти.
- **Сравнение**: для проверки идентичности объектов используйте `===`, а не `==` (который сравнивает значения).
## Когда использовать
Ссылочные типы уместны, когда нужна общая изменяемая сущность (например, модель данных, разделяемая между экранами), или когда требуется наследование. Для простых структур данных, которые должны копироваться при присваивании, предпочтительнее value types (`struct`).
## Коротко
- Reference type хранит ссылку на объект в памяти, а не сами данные.
- При присваивании копируется только ссылка, поэтому несколько переменных могут указывать на один объект.
- Изменение объекта через одну переменную видно через все остальные.
- К ссылочным типам в Swift относятся `class`, функции и замыкания.