Назад к вопросам
Junior
105
questionbank
В чем заключается отличие между ссылочными типами и типами значения?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Ссылка хранит адрес в памяти, указывающий на размещенные там данные. Фактически, переменная, хранящая ссылку, владеет только этим адресом, а не самими данными. Присваивание ссылочного типа переменной копирует ссылку, а не данные. Изменения данных, на которые указывает ссылка, отражаются во всех переменных, хранящих эту ссылку.
Тип значения хранит непосредственно сами данные. Присваивание типа значения переменной копирует сами данные. Изменения в одной переменной типа значения не влияют на другие переменные, получившие эту копию.
| Признак | Ссылочный тип | Тип значения |
|---|---|---|
| Хранение | Ссылка на данные | Сами данные |
| Присваивание | Копирование ссылки | Копирование данных |
| Изменение | Влияет на все ссылки | Не влияет на копии |
| Размещение | В куче (Heap) | В стеке (Stack) |
| Освобождение | ARC / Сборщик мусора | Автоматически при выходе из области видимости |
| Примеры в Swift | class, closure | struct, enum, tuple, базовые типы (Int, Bool, String и т.д.) |
// Пример ссылочного типа (класс)
class ReferenceType {
var value: Int
init(value: Int) {
self.value = value
}
}
let ref1 = ReferenceType(value: 10)
let ref2 = ref1 // Копируется ссылка
ref2.value = 20 // Изменяются данные, на которые указывает ref1 и ref2
print(ref1.value) // Вывод: 20
print(ref2.value) // Вывод: 20
// Пример типа значения (структура)
struct ValueType {
var value: Int
}
var val1 = ValueType(value: 10)
var val2 = val1 // Копируются данные
val2.value = 20 // Изменяются только данные в val2
print(val1.value) // Вывод: 10
print(val2.value) // Вывод: 20