Sobes.tech
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.