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