Sobes.tech
Junior
241

Was ist der Unterschied zwischen Referenztypen und Wertetypen?

Antwort von AI

sobes.tech KI

Ссылка хранит адрес в памяти, указывающий на размещенные там данные. Фактически, переменная, хранящая ссылку, владеет только этим адресом, а не самими данными. Присваивание ссылочного типа переменной копирует ссылку, а не данные. Изменения данных, на которые указывает ссылка, отражаются во всех переменных, хранящих эту ссылку.

Тип значения хранит непосредственно сами данные. Присваивание типа значения переменной копирует сами данные. Изменения в одной переменной типа значения не влияют на другие переменные, получившие эту копию.

Признак Ссылочный тип Тип значения
Хранение Ссылка на данные Сами данные
Присваивание Копирование ссылки Копирование данных
Изменение Влияет на все ссылки Не влияет на копии
Размещение В куче (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