Sobes.tech
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 deinit deinitialiseerija 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.")
}