Sobes.tech
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