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ą.