Junior
Kuo skiriasi nuorodų tipai nuo reikšmių tipų?
sobes.tech AI
Atsakymas iš AI
Nuoroda saugo atmintyje adresą, nurodantį ten saugomus duomenis. Iš esmės, kintamasis, saugantis nuorodą, turi tik šį adresą, o ne pačius duomenis. Priskiriant nuorodų tipą kintamajam, kopijuojama nuoroda, o ne duomenys. Duomenų pakeitimai, į kuriuos nurodo nuoroda, atsispindi visuose kintamuosiuose, saugančiuose šią nuorodą.
Reikšmės tipas tiesiogiai saugo duomenis. Priskiriant reikšmės tipo kintamajam, kopijuojami patys duomenys. Pakeitimai vieno reikšmės tipo kintamajame neturi įtakos kitų kopijų.
| Bruožas | Nuorodinis tipas | Reikšmės tipas |
|---|---|---|
| Saugojimas | Nuoroda į duomenis | Patys duomenys |
| Priskyrimas | Nuorodos kopijavimas | Duomenų kopijavimas |
| Pakeitimai | Daro įtaką visoms nuorodoms | Neturi įtakos kopijoms |
| Išdėstymas | Heap'e (Heap) | Stack'e (Stack) |
| Atlaisvinimas | ARC / šiukšlių surinkėjas | Automatiškai, išeinant iš matymo srities |
| Swift pavyzdžiai | class, closure | struct, enum, tuple, pagrindiniai tipai (Int, Bool, String ir kt.) |
// Nuorodinio tipo pavyzdys (klasė)
class ReferenceType {
var value: Int
init(value: Int) {
self.value = value
}
}
let ref1 = ReferenceType(value: 10)
let ref2 = ref1 // kopijuojama nuoroda
ref2.value = 20 // keičiami duomenys, į kuriuos nurodo ref1 ir ref2
print(ref1.value) // išvestis: 20
print(ref2.value) // išvestis: 20
// Reikšmės tipo pavyzdys (struktūra)
struct ValueType {
var value: Int
}
var val1 = ValueType(value: 10)
var val2 = val1 // kopijuojami duomenys
val2.value = 20 // keičiami tik duomenys val2
print(val1.value) // išvestis: 10
print(val2.value) // išvestis: 20