ProgrammierungiOS Entwickler

Erzählen Sie von dem Datentyp Set in Swift: seine Besonderheiten, Schnittstellen, Ausführungszeiten von Operationen und potenzielle Fallstricke bei der Verwendung, Unterschiede zu einem Array.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

Set ist eine ungeordnete Sammlung einzigartiger Elemente, die als Hashtabelle implementiert ist. Das Hauptunterscheidungsmerkmal zu Array ist das Fehlen von Duplikaten und die Unordnung. Die wichtigsten Schnittstellen: Einfügemethoden (insert), Löschmethoden (remove), Vorhandeneheitsprüfung (contains).

Ausführungszeiten:

  • Die Operationen insert, remove und contains funktionieren im Durchschnitt in O(1).
  • Das Durchlaufen aller Elemente — O(n).

Beispiel für die Verwendung:

var numbers: Set<Int> = [1, 2, 3] numbers.insert(4) // Set: 1, 2, 3, 4 numbers.insert(2) // Set bleibt unverändert, 2 ist bereits vorhanden numbers.remove(1) // Set: 2, 3, 4 print(numbers.contains(3)) // true

Verwenden Sie Set, wenn Einzigartigkeit wichtig ist, aber die Reihenfolge unerheblich ist. Vergleichen Sie mit Array:

  • Das Entfernen und Suchen eines Elements in Array erfolgt in O(n).
  • In Array sind gleiche Werte erlaubt.

Set unterstützt: ∪, ∩, −, ⊆, ⊇ und andere mengentheoretische Operationen.

Fangfrage

Frage:

Wird der folgende Code kompiliert und warum?

let set: Set = [[1, 2], [3, 4]]

Antwort: Nein, wird er nicht. Set erfordert, dass der Typ der Elemente dem Protokoll Hashable entspricht. Ein Array (Array) implementiert nicht Hashable, daher kann man keine Mengen von Arrays direkt erstellen. Beispielsweise ist Set<Int> korrekt, während Set<[Int]> nicht korrekt ist.

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas


Geschichte

In einem Dienst speicherten Entwickler eindeutige Objekt-IDs als [Int] anstelle von Set<Int>. Dies führte zu Problemen: Vorhandeneheitsprüfungen und Löschungen funktionierten langsam (Zeit — O(n)), es traten Duplikate auf, und die Geschäftslogik wurde verletzt.


Geschichte

Der Versuch, nicht standardisierte Typen in Set zu setzen (zum Beispiel wurde Set<MyModel> erstellt), aber der Typ implementierte nicht Hashable. Der Code wurde nur nach dem Hinzufügen der entsprechenden Protokolle kompiliert, aber bei der Implementierung von Fehlern in hash(into:) traten Kollisionen und unvorhersehbares Verhalten während der Ausführung auf.


Geschichte

Ein Entwickler erwartete, dass die Reihenfolge der Elemente in Set mit der Reihenfolge der Einfügungen übereinstimmte und gestaltete die UI in derselben Reihenfolge. Infolgedessen war die Reihenfolge bei jedem Start unterschiedlich, was zu inkonsistenten Datenanzeigen beim Endbenutzer führte.