Sobes.tech
Junior

Kuo skiriasi vertės ir nuorodos tipai Swift programavimo kalboje?

sobes.tech AI

Atsakymas iš AI

Reikšmių tipai (Value Types) ir nuorodų tipai (Reference Types) skiriasi duomenų saugojimo ir perdavimo būdais:

Reikšmių tipai:

  • Priskyrimas sukuria nepriklausomą duomenų kopiją:
  • Duomenys saugomi tiesiogiai deklaracijos vietoje arba stakte (vietiniams kintamiesiems):
  • Struktūros, išvardijimai ir tuple yra reikšmių tipai:
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 0, y: 0)
var p2 = p1 // sukuriama p1 kopija
p2.x = 10

print(p1.x) // 0
print(p2.x) // 10 - p1 nepasikeitė

Nuorodų tipai:

  • Priskyrimas sukuria nuorodą į tuos pačius duomenis:
  • Duomenys saugomi heap'e, o nuoroda — deklaracijos vietoje arba stakte:
  • Klasės yra nuorodų tipai:
class Rect {
    var width: Int
    var height: Int

    init(width: Int, height: Int) {
        self.width = width
        self.height = height
    }
}

var r1 = Rect(width: 10, height: 20)
var r2 = r1 // r2 dabar nuoroda į tą patį objektą kaip ir r1
r2.width = 30

print(r1.width) // 30 - r1 pasikeitė, nes r2 nuoroda į tą patį objektą
print(r2.width) // 30

Pagrindiniai skirtumai lentelėje:

Savybė Reikšmių tipai (Value Types) Nuorodų tipai (Reference Types)
Priskyrimas Kopijuoja duomenis Kopijuoja nuorodą
Duomenų saugojimas Deklaracijos vietoje / stakte Heap'e (nuoroda deklaracijos vietoje)
Srauto saugumas Automatiškai saugūs srautams Reikalauja sinchronizacijos
Tipai Struct, Enum, Tuple, Array, Dict Class, Function, Closure

Tarpų pasirinkimas priklauso nuo užduoties: paprastų nepriklausomų duomenų atvaizdavimui tinka Value Types, o objektų su bendru keičiamu turiniu ir paveldėjimu — Reference Types (klasės). Naudojant Value Types galima pagerinti našumą sumažinant krūvį heap'e ir supaprastinant atminties valdymą.