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