Junior
Kuo skiriasi struktūros ir klasės Swift?
sobes.tech AI
Atsakymas iš AI
Pagrindiniai skirtumai:
- Reikšmės tipas vs. nuorodos tipas: Struktūros yra reikšmės tipai, klasės – nuorodos tipai. Priskiriant arba perduodant struktūrą funkcijai, kopijuojama reikšmė. Priskiriant arba perduodant klasę, kopijuojama nuoroda į atminties bloką.
- Paveldėjimas: Struktūros nepalaiko paveldėjimo. Klasės palaiko paveldėjimą, leidžiant kurti objektų hierarchijas.
- Deinitializatoriai: Struktūros neturi deinitializatorių. Klasės gali turėti
deinitdeinitializatorių resursų atlaisvinimui. - Identiškumo lygybė: Struktūroms lyginamos visų savybių reikšmės (
==pagal numatytuosius nustatymus). Klasėms==pagal numatytuosius nustatymus lygina nuorodas (identitetą). - Našumas: Struktūros dažniausiai yra efektyvesnės dirbant su mažais duomenų kiekiais, nes jos nenaudoja dinaminės atminties paskirstymo ir neturi nuorodų skaičiavimo (ARC) išlaidų.
| Kriterijus | Struktūra (Struct) | Klasė (Class) |
|---|---|---|
| Tipas | Reikšmės tipas (Value Type) | Nuorodos tipas (Reference Type) |
| Paveldėjimas | Ne | Taip |
| Deinitializatoriai | Ne | Taip (deinit) |
| Identiteto lygybė | Reikšmių palyginimas | Nuorodų palyginimas |
| Vietos paskirstymas | Paprastai stakės (lokalioms kintamosioms) | Kumpis (heap) |
| ARC | Ne | Taip |
Pasirinkimas tarp struktūros ir klasės priklauso nuo poreikių. Struktūros gerai tinka duomenų modeliui, kai svarbus reikšmės perdavimas (pvz., koordinatės, dydis). Klasės naudojamos, kai reikalinga paveldėjimas, bendras keičiamas nuoroda į objektą arba išteklių gyvavimo ciklo valdymas.
// Struktūros pavyzdys
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2 yra kopija p1
p2.x = 5.0
// p1.x vis dar 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")
// Klasės pavyzdys
class Circle {
var radius: Double
init(radius: Double) {
self.radius = radius
}
deinit {
print("Circle objektas deinitializuojamas.")
}
}
var c1 = Circle(radius: 1.0)
var c2 = c1 // c2 nurodo į tą patį objektą kaip ir c1
c2.radius = 10.0
// c1.radius taip pat tampa 10.0
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")
// Identiteto palyginimas
if c1 === c2 { // Nurodo į tą patį objektą
print("c1 ir c2 nurodo į tą patį Circle objektą.")
} else {
print("c1 ir c2 nurodo į skirtingus objektus.")
}
// Reikšmių palyginimas (struktūroms)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Palygina visas savybes
print("p1 ir p3 turi tą pačią reikšmę.")
} else {
print("p1 ir p3 turi skirtingas reikšmes.")
}