Sobes.tech
Junior

Aký je rozdiel medzi štruktúrami a triedami v Swift?

sobes.tech AI

Odpoveď od AI

Hlavné rozdiely:

  • Typ hodnoty vs. Typ odkazu: Štruktúry sú typy hodnoty, triedy sú typy odkazu. Pri priradení štruktúry alebo jej odovzdaní do funkcie sa kopíruje hodnota. Pri priradení triedy alebo jej odovzdaní do funkcie sa kopíruje odkaz na blok pamäte.
  • Dedičnosť: Štruktúry nepodporujú dedičnosť. Triedy podporujú dedičnosť, čo umožňuje vytváranie hierarchií objektov.
  • Deinitializátory: Štruktúry nemajú deinitializátory. Triedy môžu mať deinitializátor (deinit) na uvoľnenie zdrojov.
  • Identita rovnosti: Pri štruktúrach sa porovnáva hodnota všetkých ich vlastností (predvolene s ==). Pri triedach == predvolene porovnáva odkazy (identitu).
  • Výkon: Štruktúry sú zvyčajne efektívnejšie pri práci s malým objemom dát, pretože nepoužívajú dynamické prideľovanie pamäte na halde a nemajú režijné náklady na počítanie odkazov (ARC).
Kritérium Štruktúra (Struct) Trieda (Class)
Typ Hodnota (Value Type) Odkaz (Reference Type)
Dedičnosť Nie Áno
Deinitializátory Nie Áno (deinit)
Identita rovnosti Porovnanie podľa hodnoty Porovnanie podľa odkazu
Umiestnenie Zvyčajne zásobník (pre lokálne premenné) Haldou (heap)
ARC Nie Áno

Voľba medzi štruktúrou a triedou závisí od potrieb. Štruktúry sú vhodné na modelovanie dát, kde je dôležitý prenos podľa hodnoty (napríklad súradnice, veľkosť). Triedy sa používajú, keď je potrebná dedičnosť, zdieľaná modifikovateľná referencia na objekt alebo riadenie životného cyklu zdroja.

// Príklad štruktúry
struct Point {
    var x: Double
    var y: Double
}

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

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

// Príklad triedy
class Circle {
    var radius: Double
    init(radius: Double) {
        self.radius = radius
    }
    deinit {
        print("Inštancia triedy Circle sa deinitializuje.")
    }
}

var c1 = Circle(radius: 1.0)
var c2 = c1 // c2 odkazuje na ten istý objekt ako c1
c2.radius = 10.0

// c1.radius je tiež 10.0
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")

// Porovnanie identity
if c1 === c2 { // Porovnáva odkazy
    print("c1 a c2 odkazujú na ten istý objekt triedy Circle.")
} else {
    print("c1 a c2 neodkazujú na ten istý objekt triedy Circle.")
}

// Porovnanie hodnôt (pre štruktúry)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Porovnáva hodnoty všetkých vlastností
    print("p1 a p3 majú rovnakú hodnotu.")
} else {
    print("p1 a p3 nemajú rovnakú hodnotu.")
}