In Swift is er vanaf het begin een nadruk gelegd op waarde types — structuren (struct) als het belangrijkste hulpmiddel voor gegevensmodellering. In tegenstelling tot Objective-C, waar alles objecten (klassen) waren, moedigt Swift het gebruik van structuren aan voor eenvoudige modellen, gegevens en kleine zakelijke objecten.
Veel ontwikkelaars, vooral met ervaring in andere object-georiënteerde talen, gebruiken ten onrechte klassen voor alles. Dit leidt tot geheugenproblemen (referentieketens), onverwachte wijzigingen bij het doorgeven van objecten en complicaties met thread safety, want klassen zijn referentietypes.
Structuren in Swift zijn waarde types, ze worden gekopieerd bij toewijzing en overdracht naar functies, in tegenstelling tot klassen (referentietypes), die een verwijzing doorgeven. Dit maakt structuren bij uitstek geschikt voor modellen zonder complexe levenscycluslogica en erfelijkheid.
Voorbeeldcode:
struct Point { var x: Int var y: Int } var p1 = Point(x: 10, y: 20) var p2 = p1 p2.x = 30 // p1.x blijft gelijk aan 10
Belangrijkste kenmerken:
Kan een structuur een afgeleide zijn (subclass)?
Nee, structuren in Swift ondersteunen geen erfelijkheid. Alle uitbreiding van gedrag is alleen mogelijk via protocollen en extensies.
Betekent dit dat een structuur altijd wordt gekopieerd wanneer deze naar een functie wordt doorgegeven?
In de praktijk maakt Swift gebruik van Copy-On-Write optimalisaties. Als we de structuur niet wijzigen, wordt deze niet gekopieerd, en een kopie wordt alleen gemaakt bij wijzigingen. Dit geldt voor standaardcollecties en complexe structuren.
var arr1 = [1, 2, 3] var arr2 = arr1 arr2.append(4) // Pas hier vindt de kopie plaats
In welke gevallen kan je geen structuur gebruiken?
Het gebruik van klassen voor het opslaan van homogeen gegevens (bijvoorbeeld voor punten op een kaart) resulteert in prestatieverlies door frequent geheugenaccess, complexe geheugenbeheersing en bugs met verwisselde verwijzingen.
Voordelen:
Nadelen:
Gebruik van structuren voor gegevensmodellen die veilig kunnen worden gekopieerd, geen lekken veroorzaken en geen onnodige complexiteit hebben.
Voordelen:
Nadelen: