ProgrammatieJunior iOS ontwikkelaar

Wat voor soorten collecties zijn er in Swift, hoe verschillen ze in interne implementatie en wanneer gebruik je welke collectie?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

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:

Array

Een geordende collectie van elementen, toegang via index, duplicaten zijn toegestaan. Gewoonlijk geïmplementeerd via een dynamische buffer.

Set

Een ongeordende collectie van unieke elementen (Hashable). Toegang via hash — zeer snel, duplicaten zijn niet toegestaan.

Dictionary

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:

  • Array is efficiënt voor toegang via index, behoudt volgorde, maar toegang via waarde is lineair
  • Set is snel voor zoeken en controleren of een element aanwezig is, slaat alleen unieke Hashable waarden op
  • Dictionary is optimaal voor zoeken op sleutel (Hashable), behoudt geen volgorde, maar zoekt en wijzigt waarden snel

Vragen met een valstrik.

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

Veelvoorkomende fouten en anti-patronen

  • Gebruik van Array voor het zoeken naar een uniek waarde (liever Set)
  • Gebruik van Dictionary voor het opslaan van waarden zonder de noodzaak om op sleutel te zoeken
  • Poging om non-Hashable types te gebruiken als sleutels/waarden

Voorbeeld uit het leven

Negatieve case

Een ontwikkelaar gebruikt Array voor een unieke lijst van gebruikers en zoekt uniciteit via contains. Bij grote lijsten — veel tijd aan controles.

Voordelen:

  • Eenvoudige implementatie

Nadelen:

  • Lineaire zoekcomplexiteit, overbodige opslag van duplicaten, hoge geheugenbelasting

Positieve case

Dezelfde lijst is geïmplementeerd als Set. Controle op aanwezigheid — onmiddellijk, unieke waarden zijn gegarandeerd.

Voordelen:

  • Snelle toegang, geheugenbesparing, uitsluiting van duplicaten

Nadelen:

  • Geen garanties voor de volgorde van elementen