Junior
Aký je rozdiel medzi referenčnými a hodnotovými typmi?
sobes.tech AI
Odpoveď od AI
Tipy hodnot (Value Types) sa kopírujú pri priraďovaní alebo odovzdávaní do funkcie. Každý prípad má vlastnú kópiu údajov.
Typy odkazov (Reference Types), pri priraďovaní alebo odovzdávaní do funkcie, odovzdávajú odkaz na rovnaký inštanciu údajov. Zmeny údajov cez jeden odkaz sa prejavia vo všetkých ostatných odkazoch na tú istú inštanciu.
| Charakteristika | Typ hodnot (Value Type) | Typ odkazu (Reference Type) |
|---|---|---|
| Správanie pri priraďovaní/odovzdávaní | Kopírovanie | Odovzdanie odkazu |
| Umiestnenie v pamäti | Zásobník (Heap) | Hromada (Stack) |
| Správa pamäti | Automatická (cez zásobník) | Automatická (ARC) |
| Príklady v Swift | struct, enum, tuple |
class, func, closure |
// Príklad typu hodnoty (Struct)
struct Point {
var x: Int
var y: Int
}
var p1 = Point(x: 1, y: 2)
var p2 = p1 // p2 dostáva kópiu p1
p2.x = 10 // Zmena v p2 neovplyvní p1
print("p1: \(p1)") // p1: Point(x: 1, y: 2)
print("p2: \(p2)") // p2: Point(x: 10, y: 2)
// Príklad typu odkazu (Trieda)
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 odkazuje na ten istý objekt ako c1
c2.x = 10 // Zmena v c2 ovplyvní c1, pretože obaja odkazujú na ten istý objekt
print("c1: \(c1.x)") // c1: 10
print("c2: \(c2.x)") // c2: 10