Sobes.tech
Junior

Care este diferența dintre structuri și clase în Swift?

sobes.tech AI

Răspuns de la AI

Diferențe principale:

  • Tip de valoare vs. Tip de referință: Structurile sunt tipuri de valoare, clasele sunt tipuri de referință. La atribuirea unei structuri sau la transmiterea acesteia către o funcție, se copiază valoarea. La atribuirea unei clase sau la transmiterea acesteia către o funcție, se copiază referința către un bloc de memorie.
  • Moștenire: Structurile nu suportă moștenirea. Clasele suportă moștenirea, permițând crearea de ierarhii de obiecte.
  • Deinitializatori: Structurile nu au deinitializatori. Clasele pot avea un deinit pentru eliberarea resurselor.
  • Egalitate de identitate: Pentru structuri, se compară valoarea tuturor proprietăților lor (implicit cu ==). Pentru clase, == compară implicit referințele (identitatea).
  • Performanță: Structurile sunt de obicei mai eficiente când se lucrează cu volume mici de date, deoarece nu utilizează alocare dinamică pe heap și nu au costuri suplimentare pentru numărarea referințelor (ARC).
Criteriu Structură (Struct) Clasă (Class)
Tip Valoare (Value Type) Referință (Reference Type)
Moștenire Nu Da
Deinitializatori Nu Da (deinit)
Egalitate de identitate Comparare după valoare Comparare după referință
Localizare De obicei pe stivă (pentru variabile locale) Pe heap
ARC Nu Da

Alegerea între structură și clasă depinde de nevoi. Structurile sunt potrivite pentru modelarea datelor pentru care transferul după valoare este important (de exemplu, coordonate, dimensiuni). Clasele sunt utilizate atunci când este necesară moștenirea, o referință mutabilă partajată la un obiect sau gestionarea ciclului de viață al resurselor.

// Exemplu de structură
struct Point {
    var x: Double
    var y: Double
}

var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2 este o copie a lui p1
p2.x = 5.0

// p1.x rămâne 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")

// Exemplu de clasă
class Circle {
    var radius: Double
    init(radius: Double) {
        self.radius = radius
    }
    deinit {
        print("Obiectul Circle este dezinitializat.")
    }
}

var c1 = Circle(radius: 1.0)
var c2 = c1 // c2 face referire la aceeași instanță ca și c1
c2.radius = 10.0

// c1.radius devine, de asemenea, 10.0
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")

// Compararea identității
if c1 === c2 { // Compară referințele
    print("c1 și c2 se referă la aceeași instanță Circle.")
} else {
    print("c1 și c2 nu se referă la aceeași instanță Circle.")
}

// Compararea valorilor (pentru structuri)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Compară valorile tuturor proprietăților
    print("p1 și p3 au aceeași valoare.")
} else {
    print("p1 și p3 nu au aceeași valoare.")
}