Junior
Jaké jsou rozdíly mezi hodnotovými a referenčními typy v programovacím jazyce Swift?
sobes.tech AI
Odpověď od AI
Hodnotové typy (Value Types) a referenční typy (Reference Types) se liší způsobem ukládání a přenosu dat.
Hodnotové typy:
- Přiřazení vytváří nezávislou kopii dat.
- Data jsou uložena přímo na místě deklarace nebo na zásobníku (pro místní proměnné).
- Struktury, výčty a n-tice jsou hodnotové typy.
struct Point {
var x: Int
var y: Int
}
var p1 = Point(x: 0, y: 0)
var p2 = p1 // Vytvoří se kopie p1
p2.x = 10
print(p1.x) // 0
print(p2.x) // 10 - p1 se nezměnilo
Referenční typy:
- Přiřazení vytváří novou referenci na stejné data.
- Data jsou uložena na haldě, a odkaz na ně je na místě deklarace nebo na zásobníku.
- Třídy jsou referenční typy.
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 odkazuje na stejný objekt jako r1
r2.width = 30
print(r1.width) // 30 - r1 se změnilo, protože r2 odkazuje na stejný objekt
print(r2.width) // 30
Hlavní rozdíly v tabulce:
| Charakteristika | Hodnotové typy (Value Types) | Referenční typy (Reference Types) |
|---|---|---|
| Přiřazení | Kopíruje data | Kopíruje odkaz |
| Uložení dat | Na místě deklarace / zásobník | Na haldě (odkaz na místě deklarace) |
| Bezpečnost vláken | Výchozí bezpečné pro vlákna | Vyžadují synchronizaci pro vlákna |
| Typy | Struct, Enum, Tuple, Array, Dict | Class, Function, Closure |
Volba mezi typy závisí na úkolu: pro reprezentaci jednoduchých nezávislých dat jsou preferovány hodnotové typy, pro objekty s sdílenou měnitelnou entitou a děděním - referenční typy (třídy). Použití hodnotových typů může zlepšit výkon snížením zátěže na haldu a zjednodušením správy paměti.