Junior
Aké sú rozdiely medzi hodnotovými a referenčnými typmi v programovacom jazyku Swift?
sobes.tech AI
Odpoveď od AI
Typy hodnôt (Value Types) a referenčné typy (Reference Types) sa líšia spôsobom, akým ukladajú a prenášajú údaje.
Typy hodnôt:
- Priradenie vytvára nezávisú kópiu údajov.
- Údaje sa ukladajú priamo na mieste deklarácie alebo na zásobníku (pre lokálne premenné).
- Štruktúry, enumy a tuple sú typy hodnôt.
struct Point {
var x: Int
var y: Int
}
var p1 = Point(x: 0, y: 0)
var p2 = p1 // Vytvorí sa kópia p1
p2.x = 10
print(p1.x) // 0
print(p2.x) // 10 - p1 sa nezmenilo
Referenčné typy:
- Priradenie vytvára novú referenciu na tie isté údaje.
- Údaje sa ukladajú na halde, a referencia na ne je na mieste deklarácie alebo na zásobníku.
- Triedy sú 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 ten istý objekt ako r1
r2.width = 30
print(r1.width) // 30 - r1 sa zmenilo, pretože r2 odkazuje na ten istý objekt
print(r2.width) // 30
Hlavné rozdiely v tabuľke:
| Charakteristika | Typy hodnôt (Value Types) | Typy referencií (Reference Types) |
|---|---|---|
| Priradenie | Kopíruje údaje | Kopíruje odkaz |
| Ukladanie údajov | Na mieste deklarácie / zásobník | V halde (odkaz na mieste deklarácie) |
| Bezpečnosť vlákien | Predvolene bezpečné pre vlákna | Vyžadujú synchronizáciu pre vlákna |
| Typy | Struct, Enum, Tuple, Array, Dict | Class, Function, Closure |
Voľba medzi typmi závisí od úlohy: na reprezentáciu jednoduchých nezávislých údajov sú preferované Typy hodnôt, pre objekty s spoločnou, zmeniteľnou entitou a dedičstvom - Typy referencií (triedy). Použitie Typov hodnôt môže zlepšiť výkon znížením záťaže na haldu a zjednodušením správy pamäte.