Sobes.tech
Junior — Middle

Jak rozlišit datové typy založené na odkazech od typů, které ukládají hodnoty přímo?

sobes.tech AI

Odpověď od AI

V iOS (Swift a Objective-C) jsou datové typy rozděleny na typy hodnot (value types) a referenční typy (reference types).

  • Typy hodnot přímo ukládají data. Při přiřazení nebo předání funkci se vytvoří kopie dat. Ve Swiftu patří mezi ně struktury (struct), výčty (enum) a základní typy, například Int, Double, Bool.

  • Referenční typy ukládají odkaz na oblast paměti, kde jsou data uložena. Při přiřazení se kopíruje odkaz, nikoli data samotná. Změny přes odkaz jsou viditelné i jinde. Ve Swiftu jsou to třídy (class).

Jak je odlišit:

  • Ve Swiftu, pokud je typ deklarován jako struct nebo enum, je to typ hodnot.
  • Pokud je deklarován jako class, je to referenční typ.

Příklad:

struct Point {
    var x: Int
    var y: Int
}

class Person {
    var jmeno: String
    init(jmeno: String) {
        self.jmeno = jmeno
    }
}

var p1 = Point(x: 0, y: 0)
var p2 = p1
p2.x = 10
print(p1.x) // 0 - kopie se nezměnila

var osoba1 = Person(jmeno: "Alice")
var osoba2 = osoba1
osoba2.jmeno = "Bob"
print(osoba1.jmeno) // Bob - obě proměnné odkazují na stejný objekt

Tímto způsobem lze podle chování při přiřazení a změně rozlišit typy založené na odkazech od těch, které přímo ukládají hodnoty.