Sobes.tech
Junior

Jaký je rozdíl mezi strukturami a třídami ve Swiftu?

sobes.tech AI

Odpověď od AI

Hlavní rozdíly:

  • Typ hodnoty vs. Typ odkazu: Struktury jsou typy hodnot, třídy jsou typy odkazů. Při přiřazení struktury nebo jejím předání do funkce se kopíruje hodnota. Při přiřazení třídy nebo jejím předání do funkce se kopíruje odkaz na blok paměti.
  • Dědičnost: Struktury nepodporují dědičnost. Třídy dědičnost podporují, umožňují vytváření hierarchií objektů.
  • Deinitializátory: Struktury nemají deinitializátory. Třídy mohou mít deinitializátor (deinit) pro uvolnění zdrojů.
  • Identitní rovnost: U struktur se porovnává hodnota všech jejich vlastností (při použití == ve výchozím nastavení). U tříd == ve výchozím nastavení porovnává odkazy (identitu).
  • Výkon: Struktury jsou obvykle výkonnější při práci s malým objemem dat, protože nepoužívají dynamické alokace na haldě a nemají režii spojenou s počítáním odkazů (ARC).
Kritérium Struktura (Struct) Třída (Class)
Typ Hodnoty (Value Type) Odkazy (Reference Type)
Dědičnost Ne Ano
Deinitializátory Ne Ano (deinit)
Identitní rovnost Porovnání podle hodnoty Porovnání podle odkazu
Umístění Obvykle zásobník (pro lokální proměnné) Halda
ARC Ne Ano

Volba mezi strukturou a třídou závisí na potřebách. Struktury jsou vhodné pro modelování dat, kde je důležitý přenos podle hodnoty (například souřadnice, velikost). Třídy se používají, když je potřeba dědičnost, sdílená modifikovatelná reference na objekt nebo řízení životního cyklu zdroje.

// Příklad struktury
struct Point {
    var x: Double
    var y: Double
}

var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2 je kopie p1
p2.x = 5.0

// p1.x je stále 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")

// Příklad třídy
class Circle {
    var radius: Double
    init(radius: Double) {
        self.radius = radius
    }
    deinit {
        print("Instance třídy Circle je deinitializována.")
    }
}

var c1 = Circle(radius: 1.0)
var c2 = c1 // c2 odkazuje na stejný objekt jako c1
c2.radius = 10.0

// c1.radius je také 10.0
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")

// Porovnání identity
if c1 === c2 { // Porovnává odkazy
    print("c1 a c2 odkazují na stejný objekt třídy Circle.")
} else {
    print("c1 a c2 neodkazují na stejný objekt třídy Circle.")
}

// Porovnání hodnot (pro struktury)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Porovnává hodnoty všech vlastností
    print("p1 a p3 mají stejnou hodnotu.")
} else {
    print("p1 a p3 nemají stejnou hodnotu.")
}