Junior
Mis vahe on struktuuride ja klasside vahel Swiftis?
sobes.tech AI
Vastus AI-lt
Peamised erinevused:
- Väärtusetüüp vs. Viite tüüp: Struktuurid on väärtusetüübid, klassid on viidetüübid. Struktuuri määramisel või edastamisel funktsioonile kopeeritakse väärtus. Klasside määramisel või edastamisel funktsioonile kopeeritakse viide mäluplokile.
- Pärimine: Struktuurid ei toeta pärimist. Klassid toetavad pärimist, võimaldades luua objektihierarhiaid.
- Deinitialiseerijad: Struktuuridel ei ole deinitialiseerijaid. Klassidel võib olla
deinitdeinitialiseerija ressursside vabastamiseks. - Identiteedi võrdlus: Struktuuride puhul võrreldakse kõigi nende omaduste väärtusi (
==vaikimisi). Klasside puhul võrreldakse vaikimisi viiteid (identiteeti). - Jõudlus: Struktuurid on tavaliselt tõhusamad väikese andmemahu korral, kuna nad ei kasuta dünaamilist mäe eraldamist ja neil puudub viidete arvutamise (ARC) ülekoormus.
| Kriteerium | Struktuur (Struct) | Klass (Class) |
|---|---|---|
| Tüüp | Väärtusetüüp (Value Type) | Viidetüüp (Reference Type) |
| Pärimine | Ei | Jah |
| Deinitialiseerijad | Ei | Jah (deinit) |
| Identiteedi võrdlus | Väärtuse põhjal | Viidete põhjal |
| Asukoht | Tavaliselt virnas (lokalsete muutujate jaoks) | Kopp (heap) |
| ARC | Ei | Jah |
Valik struktuuri ja klassi vahel sõltub vajadustest. Struktuurid sobivad andmete modelleerimiseks, kus oluline on väärtuse edastamine (näiteks koordinaadid, suurus). Klassid kasutatakse siis, kui on vaja pärimist, jagatud muudetavat viidet objekti või ressursi elutsükli juhtimiseks.
// Struktuuri näide
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2 on p1 koopja
p2.x = 5.0
// p1.x on endiselt 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")
// Klassinäide
class Circle {
var radius: Double
init(radius: Double) {
self.radius = radius
}
deinit {
print("Circle objekti deinitialiseerub.")
}
}
var c1 = Circle(radius: 1.0)
var c2 = c1 // c2 viitab samale objektile nagu c1
c2.radius = 10.0
// c1.radius muutub samuti 10.0
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")
// Identiteedi võrdlus
if c1 === c2 { // Võrdleb viiteid
print("c1 ja c2 viitavad samale Circle objektile.")
} else {
print("c1 ja c2 ei viita samale objektile.")
}
// Väärtuse võrdlus (struktuuride puhul)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Võrdleb kõiki omadusi
print("p1 ja p3 on sama väärtus.")
} else {
print("p1 ja p3 on erinevad väärtused.")
}