Set is een ongeordende collectie van unieke elementen, geïmplementeerd als een hash-tabel. Het belangrijkste verschil met Array is de afwezigheid van duplicaten en de afwezigheid van een volgorde. De belangrijkste interfaces: invoermethoden (insert), verwijdering (remove), en aanwezigheid controle (contains).
Uitvoeringstijd:
insert, remove en contains werken gemiddeld in O(1).Voorbeeld van gebruik:
var numbers: Set<Int> = [1, 2, 3] numbers.insert(4) // Set: 1, 2, 3, 4 numbers.insert(2) // Set verandert niet, 2 is al aanwezig numbers.remove(1) // Set: 2, 3, 4 print(numbers.contains(3)) // true
Gebruik Set wanneer uniekheid belangrijk is, maar volgorde niet. Vergelijk met Array:
Array gebeurt in O(n).Array zijn duplicaten toegestaan.Set ondersteunt: ∪, ∩, −, ⊆, ⊇ en andere set-theoretische operaties.
Vraag:
Zal de volgende code compileren en waarom?
let set: Set = [[1, 2], [3, 4]]
Antwoord:
Nee, dat zal niet. Set vereist dat het type elementen voldoet aan het Hashable protocol. Een array (Array) implementeert niet Hashable, dus het is niet mogelijk om sets van arrays direct te creëren. Bijvoorbeeld, Set<Int> is correct, maar Set<[Int]> is niet.
Verhaal
In een service slaagden ontwikkelaars erin om unieke object-id's op te slaan als [Int], in plaats van Set<Int>. Dit veroorzaakte problemen: controles op aanwezigheid en verwijderen werkten langzaam (tijd — O(n)), er verschenen duplicaten, waardoor de bedrijfslogica werd aangetast.
Verhaal
Een poging om niet-standaardtypen in Set te plaatsen (bijvoorbeeld een Set<MyModel> te maken), maar het type implementeerde niet Hashable. De code compileerde alleen na toevoeging van de bijbehorende protocollen, maar bij implementatiefouten in hash(into:) ontstonden er botsingen en onvoorspelbaar gedrag tijdens uitvoering.
Verhaal
Een ontwikkelaar verwachtte dat de volgorde van itereren door elementen in Set zou overeenkomen met de volgorde van invoer, en bouwde de UI in dezelfde volgorde. Als gevolg hiervan was de volgorde bij elke uitvoering anders, wat leidde tot inconsistente weergave van gegevens voor de eindgebruiker.