Sobes.tech
Middle

Ką reiškia, kad reikšmės tipas (value type) priklauso nuorodos tipui (reference type)?

sobes.tech AI

Atsakymas iš AI

Vertės tipo reikšmė kopijuojama priskyrimo ar perduodant į funkciją, o nuorodos tipas perduodamas nuoroda, tai yra, kopijuojamas nuorodos į esamą egzempliorių.

Reikšmių tipai (Value Types):

  • Struktūros (struct)
  • Enumai (enum)
  • Tūpiai (tuple)
  • Dauguma pagrindinių tipų (Int, String, Bool, Array, Dictionary, Set ir kt.)
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 1, y: 2)
var p2 = p1 // kopijuojama p1 reikšmė į p2
p2.x = 10

// p1.x vis dar 1, p2.x tapo 10
print("p1: \(p1.x)")
print("p2: \(p2.x)")

Nuorodų tipai (Reference Types):

  • Klasės (class)
  • Funkcijos (closure)
class Coordinate {
    var x: Int
    var y: Int

    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

var c1 = Coordinate(x: 1, y: 2)
var c2 = c1 // c2 nurodo tą patį egzempliorių kaip ir c1
c2.x = 10

// c1.x taip pat tapo 10
print("c1: \(c1.x)")
print("c2: \(c2.x)")

Pagrindiniai skirtumai:

Charakteristika Reikšmės tipas (Value Type) Nuorodos tipas (Reference Type)
Priskyrimas Reikšmės kopijavimas Nuorodos (rodyklės) kopijavimas
Atmintis Skiriama stack'e (paprastiems atvejams) Skiriama heap'e
Bendras naudojimas Kiekviena kintamoji turi savo kopiją Keletas kintamųjų gali nurodyti tą patį egzempliorių
Mutabilumas Keisti reikia keisti kopiją Keitimas per vieną nuorodą matomas visiems kitiems

iOS kūrime dažnai naudojami abu tipai. Žinant jų skirtumus, galima pasirinkti tinkamą tipą konkrečiam uždaviniui ir išvengti nepageidaujamų šalutinių efektų, ypač dirbant su mutabiliais duomenimis.