Ответ
Value Type (типы-значения) и Reference Type (ссылочные типы) — это фундаментальные категории типов в Swift, определяющие, как данные хранятся и копируются.
| Аспект | Value Type (Структура, Enum, Кортеж) | Reference Type (Класс, Замыкание) |
|---|---|---|
| Хранение | Копия данных хранится непосредственно в переменной (часто в стеке). | Данные хранятся в куче, переменная содержит ссылку на них. |
| Копирование | При присваивании (=) или передаче в функцию создается новая, независимая копия данных. |
Копируется только ссылка на одни и те же данные в памяти. |
| Изменяемость | По умолчанию иммутабельны. Для мутации методов используется mutating. |
Мутабельны по умолчанию (если свойства не let). |
| Потокобезопасность | Безопасны, так как каждый поток работает со своей копией. | Требует синхронизации, так как состояние общее. |
| Наследование | Не поддерживают наследование. Поддерживают протоколы. | Поддерживают наследование (один родительский класс). |
| Управление памятью | Автоматическое (стек). | Подсчет ссылок (ARC). |
Практический пример:
// VALUE TYPE (Struct)
struct Point {
var x, y: Int
}
var pointA = Point(x: 1, y: 2)
var pointB = pointA // Создается ПОЛНАЯ КОПИЯ
pointB.x = 3
print(pointA.x) // 1 (pointA не изменился)
// REFERENCE TYPE (Class)
class Person {
var name: String
init(name: String) { self.name = name }
}
var personA = Person(name: "Alice")
var personB = personA // Копируется ССЫЛКА на тот же объект
personB.name = "Bob"
print(personA.name) // "Bob" (personA изменился, так как это тот же объект)
Когда что использовать:
- Value types — для простых данных, моделей, когда нужна независимость копий и потокобезопасность. Это подход по умолчанию в Swift.
- Reference types — когда необходимо разделяемое, мутабельное состояние или наследование (например, для UI-компонентов
UIViewController).