Junior
Aký je rozdiel medzi referenčnými typmi a typmi hodnôt?
sobes.tech AI
Odpoveď od AI
Odkaz ukladá adresu v pamäti, ktorá ukazuje na údaje uložené tam. V skutočnosti vlastník premennej, ktorá ukladá odkaz, má iba túto adresu, nie samotné údaje. Priradenie referenčného typu premennej skopíruje odkaz, nie údaje. Zmeny v údajoch, na ktoré odkaz ukazuje, sa odrážajú vo všetkých premenných, ktoré tento odkaz ukladajú.
Typ hodnoty priamo ukladá údaje. Priradenie typu hodnoty premennej skopíruje samotné údaje. Zmeny v jednej premennej typu hodnoty neovplyvňujú iné premenne, ktoré dostali túto kópiu.
| Vlastnosť | Referenčný typ | Typ hodnoty |
|---|---|---|
| Uloženie | Odkaz na údaje | Samotné údaje |
| Priradenie | Kópia odkazu | Kópia údajov |
| Zmena | Ovplyvňuje všetky odkazy | Neovplyvňuje kópie |
| Umiestnenie | V heap-e | V zásobníku |
| Uvoľnenie | ARC / garbage collector | Automaticky pri opustení rozsahu |
| Príklady v Swift-e | class, closure | struct, enum, tuple, základné typy (Int, Bool, String a pod.) |
// Príklad referenčného typu (trieda)
class ReferenceType {
var value: Int
init(value: Int) {
self.value = value
}
}
let ref1 = ReferenceType(value: 10)
let ref2 = ref1 // Odkaz sa kopíruje
ref2.value = 20 // Údaje, na ktoré ukazujú ref1 a ref2, sa menia
print(ref1.value) // Výstup: 20
print(ref2.value) // Výstup: 20
// Príklad typu hodnoty (štruktúra)
struct ValueType {
var value: Int
}
var val1 = ValueType(value: 10)
var val2 = val1 // Údaje sa kopírujú
val2.value = 20 // Menia sa iba údaje v val2
print(val1.value) // Výstup: 10
print(val2.value) // Výstup: 20