ProgrammatieiOS-ontwikkelaar

Vertel over het gegevenstype Set in Swift: de kenmerken, interfaces, uitvoeringstijden van operaties en mogelijke valkuilen bij gebruik, verschillen met array (Array).

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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:

  • Operaties insert, remove en contains werken gemiddeld in O(1).
  • Itereren door alle elementen — O(n).

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:

  • Verwijderen en zoeken van een element in Array gebeurt in O(n).
  • In Array zijn duplicaten toegestaan.

Set ondersteunt: ∪, ∩, −, ⊆, ⊇ en andere set-theoretische operaties.

Tricky vraag

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.

Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp


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.