Struct — is een waardetype (value type) in de taal Swift, waarvan de instanties worden gekopieerd bij overdracht tussen codedelen. In tegenstelling tot klassen ondersteunen structuren geen overerving, maar implementeren ze protocollen, bevatten ze eigenschappen en methoden en zorgen ze voor voorspelbaar geheugenbeheer zonder ARC. Volgens Swift Programming Language Guide, 2026, is struct de basisbouwsteen van Swift — zelfs de standaardtypen Int, String, Array en Dictionary zijn geïmplementeerd als structuren. De taal beveelt structuren aan als prioritaire keuze voor het modelleren van gegevens.
Belangrijkste punten
Struct (structuur) — is een samengesteld gegevenstype in Swift dat gerelateerde eigenschappen en methoden groepeert in één entiteit. In tegenstelling tot klassen zijn structuren value types: bij overdracht aan een functie of toewijzing aan een nieuwe variabele wordt een onafhankelijke kopie van de structuur gemaakt, geen verwijzing naar het originele object.
Swift gebruikt structuren voor alle primitieve typen: Int, Double, String, Bool, Array, Dictionary en Set. Dit betekent dat zelfs een basisgetal Int zich als een structuur gedraagt — bij toewijzing wordt een kopie gemaakt. De ontwikkelaar kan zijn eigen structuur definiëren met een willekeurige set eigenschappen en methoden.
Volgens Swift Evolution (SE-0143) is de beslissing om standaardtypen als structuren te implementeren ingegeven door prestaties en voorspelbaarheid. Value types creëren geen referentiecycli, vereisen geen ARC-referentietelling en garanderen dat wijziging van de kopie het origineel niet beïnvloedt — dit is cruciaal voor onveranderlijkheid van gegevens in multithreaded scenario's.
Value type semantics — het belangrijkste verschil tussen struct en class. Wanneer u een structuur aan een nieuwe variabele toewijst of aan een functie doorgeeft, maakt Swift een onafhankelijke kopie van alle gegevens. Eventuele wijzigingen in de kopie hebben geen invloed op het origineel, waardoor bijwerkingen die kenmerkend zijn voor referentietypen worden geëlimineerd.
// Voorbeeld van value type semantiek
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 10, y: 20)
var p2 = p1 // p2 is een onafhankelijke kopie van p1
p2.x = 99 // Alleen p2 verandert
print(p1.x) // 10 — p1 ongewijzigd
print(p2.x) // 99
Swift gebruikt Copy-on-Write (COW) om kopiëren te optimaliseren. Als meerdere variabelen naar dezelfde structuur verwijzen, maar geen van hen de gegevens wijzigt, vindt er geen daadwerkelijk kopiëren plaats. Swift deelt het geheugen tussen variabelen tot de eerste mutatie — dan wordt een echte kopie gemaakt. Dit voorkomt overbodige allocatie-operaties en versnelt het werken met collecties.
Standaard kunnen methoden van een structuur de eigenschappen ervan niet wijzigen — Swift vereist expliciete vermelding van mutating voor methoden die wijzigingen aanbrengen. Deze beperking beschermt tegen accidentele mutatie en maakt de code voorspelbaar: als een methode niet is gemarkeerd als mutating, heeft u de garantie dat u de structuur niet zult wijzigen.
Wanneer u het trefwoord mutating voor de methode plaatst, krijgt Swift de mogelijkheid om nieuwe waarden in de eigenschappen van de structuur te schrijven. In feite kan de methode de instantie van de structuur zelfs volledig vervangen door een nieuwe via self = . Dit mechanisme wordt bijvoorbeeld gebruikt in de typen Option en Result.
// Struct met mutating methode
struct Counter {
private var value: Int = 0
// Mutating methode — kan eigenschappen wijzigen
mutating func increment() {
value += 1
}
// Mutating methode kan self volledig vervangen
mutating func reset() {
self = Counter()
}
// Non-mutating methode — alleen lezen
func currentValue() -> Int {
return value
}
}
var counter = Counter()
counter.increment()
print(counter.currentValue()) // 1
counter.reset()
print(counter.currentValue()) // 0
Regels voor mutating: de structuur moet worden gedeclareerd met var, niet met let — voor een constante structuur kan een mutating methode niet worden aangeroepen. De compiler controleert dit tijdens het compileren: een poging om een mutating methode aan te roepen op een let-constante leidt tot een compilatiefout.
De keuze tussen struct en class — een van de fundamentele beslissingen in Swift. Beide typen kunnen eigenschappen, methoden, initializers bevatten en protocollen implementeren, maar hebben fundamentele verschillen in geheugensemantiek, overerving en levenscyclusbeheer.
| Kenmerk | struct | class |
|---|---|---|
| Type | Value type (wordt gekopieerd) | Reference type (verwijzing) |
| Overerving | Ondersteunt niet | Ondersteunt |
| ARC / referentietelling | Niet vereist | Vereist ARC |
| De-initialisatie | Ondersteunt niet | Ondersteunt deinit |
| Wijzigen van eigenschappen in constante | Alleen via var | Mogelijk via let (verwijzing is constant) |
| Type casting | Ondersteunt niet | Ondersteunt |
| Opslag in collecties | Direct opgeslagen (waarde) | Opgeslagen als verwijzing (pointer) |
Structuren hebben de voorkeur wanneer gegevens geen overerving vereisen, geen gedeelde identiteit mogen hebben (bijvoorbeeld coördinaten, afmetingen, configuratie) en tussen modules worden doorgegeven. Klassen worden gekozen voor UI-componenten (UIView, UIViewController), singleton en objecten met gedeelde identiteit.
Apple raadt aan om struct te gebruiken als standaardtype voor het modelleren van gegevens in Swift. Structuren zijn geschikt voor de meeste scenario's dankzij de voorspelbare kopieersemantiek en de afwezigheid van overhead voor referentietelling. Laten we de typische gevallen bekijken waarin struct de optimale keuze is.
Als de entiteit gegevens bevat zonder noodzaak tot overerving (Product, User, Order, Point), gebruik dan struct. De compiler genereert automatisch een memberwise initializer — u hoeft init niet handmatig te schrijven. Equatable en Hashable worden ook automatisch geïmplementeerd voor structuren waarvan alle eigenschappen aan deze protocollen voldoen.
Voor configuraties, instellingen en vlaggen die niet veranderen na creatie, heeft struct de voorkeur boven class. Een constante (let) structuur garandeert de onveranderlijkheid van alle geneste velden — bij class heeft dit alleen betrekking op de verwijzing, niet op de inhoud van het object.
Structuren zijn veilig in een multithreaded omgeving vanwege value semantics. Elke thread krijgt een onafhankelijke kopie van de gegevens en beïnvloedt andere threads niet. Race conditions tussen threads zijn onmogelijk voor value types, wat struct de voorkeurskeuze maakt voor modellen in SwiftUI (ObservableObject vereist class, maar @State gebruikt struct).
// Voorbeeld van struct gebruik voor gegevensmodel
struct User: Codable, Identifiable {
let id: UUID
var name: String
var email: String
var isPremium: Bool
// Computed eigenschap — non-mutating
var displayName: String {
isPremium ? "\(name) ⭐️" : name
}
}
// Automatische memberwise initializer
let user = User(
id: UUID(),
name: "Alice",
email: "alice@example.com",
isPremium: true
)
// Kopiëren is veilig voor multithreading
var userCopy = user
userCopy.isPremium = false
// user.isPremium blijft true
Gebruik class wanneer u overerving (UIKit/AppKit componenten), gedeelde identiteit (delegate, observer) of gecontroleerde levensduur van objecten (deinit) nodig hebt. Voor al het andere — struct.
Veelgestelde vragen
Struct in Swift — is een waardetype (value type) dat wordt gekopieerd bij overdracht tussen codedelen. Structuren kunnen eigenschappen, methoden, initializers bevatten en protocollen implementeren. De basistypen van Swift (Int, String, Array) zijn geïmplementeerd als structuren.
Struct — value type (wordt gekopieerd bij toewijzing), ondersteunt geen overerving en vereist geen ARC. Class — reference type (wordt doorgegeven via verwijzing), ondersteunt overerving, de-initialisatie en referentietelling. Ontwikkelaars raden struct aan als standaardtype.
Mutating — het trefwoord dat aangeeft dat een methode van de structuur de eigenschappen ervan kan wijzigen. Zonder mutating verbiedt de compiler wijziging van velden. Mutating methoden kunnen alleen worden aangeroepen op variabelen die zijn gedeclareerd met var, niet let.
Copy-on-Write (COW) — een optimalisatie van Swift voor structuren, waarbij het daadwerkelijke kopiëren van gegevens wordt uitgesteld tot het moment van de eerste mutatie. Zolang alle variabelen de structuur alleen lezen, delen ze één geheugengebied. Dit verbetert de prestaties bij het werken met grote collecties.
Gebruik struct voor gegevensmodellen zonder overerving, configuraties, DTO's en multithreaded scenario's. Gebruik class voor UIKit/AppKit UI-componenten, singleton, entiteiten met gedeelde identiteit (delegate, observer) en objecten die de-initialisatie vereisen.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook