Sobes.tech
Junior

Wat is het verschil tussen structuren en klassen in Swift?

sobes.tech AI

Antwoord van AI

Belangrijkste verschillen:

  • Waarde type vs. Referentie type: Structuren zijn waarde types, klassen zijn referentie types. Bij het toewijzen van een structuur of het doorgeven ervan aan een functie, wordt de waarde gekopieerd. Bij het toewijzen van een klasse of het doorgeven ervan aan een functie, wordt de referentie naar een geheugenblok gekopieerd.
  • Overerving: Structuren ondersteunen geen overerving. Klassen ondersteunen overerving, waardoor hiërarchieën van objecten kunnen worden gemaakt.
  • Deinitializers: Structuren hebben geen deinitializers. Klassen kunnen een deinit hebben om bronnen vrij te geven.
  • Identiteitsgelijkheid: Voor structuren wordt de waarde van al hun eigenschappen vergeleken (standaard met ==). Voor klassen vergelijkt == standaard de referenties (identiteit).
  • Prestaties: Structuren zijn over het algemeen efficiënter bij het werken met kleine hoeveelheden gegevens, omdat ze geen dynamische geheugenallocatie op de heap gebruiken en geen extra kosten hebben voor referentietelling (ARC).
Criteria Struct (Struct) Klasse (Class)
Type Waarden (Value Type) Referenties (Reference Type)
Overerving Nee Ja
Deinitializers Nee Ja (deinit)
Identiteitsgelijkheid Vergelijking op waarde Vergelijking op referentie
Locatie Meestal op de stack (voor lokale variabelen) Op de heap
ARC Nee Ja

De keuze tussen structuur en klasse hangt af van de behoeften. Structuren zijn geschikt voor het modelleren van gegevens waarbij overdracht door waarde belangrijk is (bijvoorbeeld coördinaten, grootte). Klassen worden gebruikt wanneer overerving, een gedeelde mutable referentie naar een object of levenscyclusbeheer nodig is.

// Voorbeeld van structuur
struct Point {
    var x: Double
    var y: Double
}

var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2 is een kopie van p1
p2.x = 5.0

// p1.x blijft 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")

// Voorbeeld van klasse
class Circle {
    var radius: Double
    init(radius: Double) {
        self.radius = radius
    }
    deinit {
        print("Circle instantie wordt gedeinitialiseerd.")
    }
}

var c1 = Circle(radius: 1.0)
var c2 = c1 // c2 verwijst naar dezelfde instantie als c1
c2.radius = 10.0

// c1.radius wordt ook 10.0
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")

// Identiteitsvergelijking
if c1 === c2 { // Vergelijkt referenties
    print("c1 en c2 verwijzen naar dezelfde Circle instantie.")
} else {
    print("c1 en c2 verwijzen niet naar dezelfde Circle instantie.")
}

// Vergelijking van waarden (voor structuren)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Vergelijkt alle eigenschappen
    print("p1 en p3 hebben dezelfde waarde.")
} else {
    print("p1 en p3 hebben niet dezelfde waarde.")
}