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
deinitpentru 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.")
}