Junior
Каква е разликата между референтните типове и типовете стойности?
sobes.tech AI
Отговор от 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