In Swift zijn er drie hoofd standaardcollecties: Array, Set en Dictionary. Elke collectie implementeert verschillende interfaces, verschilt in interne structuur en is bedoeld voor verschillende taken.
Achtergrond van de vraag:
Swift-collecties zijn ontworpen met een focus op typeveiligheid (type safety) en prestaties, inclusief value semantics en copy-on-write voor Arrays/Set/Dictionary.
Probleem:
Vaak gebruikt een beginnende ontwikkelaar alleen Array waar het correcter zou zijn om Set of Dictionary te gebruiken, wat leidt tot geheugenverspilling en een verminderde snelheid van toegang/zoeken. Het is belangrijk om de verschillen te begrijpen.
Oplossing:
Een geordende collectie van elementen, toegang via index, duplicaten zijn toegestaan. Gewoonlijk geïmplementeerd via een dynamische buffer.
Een ongeordende collectie van unieke elementen (Hashable). Toegang via hash — zeer snel, duplicaten zijn niet toegestaan.
Een collectie van sleutel-waardeparen. De sleutel moet Hashable zijn. Toegang tot de waarde via de sleutel (door een hash-tabel).
Voorbeeldcode:
var arr: [Int] = [1, 2, 3, 4] var set: Set<Int> = [1, 2, 2, 3] var dict: [String: Int] = ["a": 1, "b": 2] // set == [1, 2, 3] — duplicaten worden weggelaten
Kernkenmerken:
Kun je non-Hashable types gebruiken als elementen van Set of Dictionary?
Nee. Voor opslag in Set/Dictionary moet een element Hashable zijn (een unieke hash-identificator hebben). Anders zal de compiler het niet toestaan om de collectie aan te maken.
struct Point {} // Set<Point> zal een fout veroorzaken, omdat Point niet Hashable is
Is de volgorde van opslag van elementen in Set dezelfde als zoals ze zijn toegevoegd?
Nee. Set garandeert geen volgorde — iteratie kan elke volgorde opleveren. Als je een volgorde nodig hebt, gebruik dan Array.
Wat gebeurt er als je probeert toegang te krijgen tot een niet-bestaande sleutel in Dictionary?
Dictionary retourneert een Optional. Wees voorzichtig — een poging om toegang te krijgen via een niet-bestaande sleutel geeft nil terug, geen fout.
let val = dict["not exist"] // val — nil
Een ontwikkelaar gebruikt Array voor een unieke lijst van gebruikers en zoekt uniciteit via contains. Bij grote lijsten — veel tijd aan controles.
Voordelen:
Nadelen:
Dezelfde lijst is geïmplementeerd als Set. Controle op aanwezigheid — onmiddellijk, unieke waarden zijn gegarandeerd.
Voordelen:
Nadelen: