ProgrammierungJunior iOS Entwickler

Welche Arten von Sammlungen gibt es in Swift, wie unterscheiden sie sich in ihrer internen Implementierung und wann welche Sammlung zu verwenden ist?

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

Antwort.

In Swift gibt es drei Hauptstandardsammlungen: Array, Set und Dictionary. Jede von ihnen implementiert unterschiedliche Schnittstellen, hat eine unterschiedliche interne Struktur und ist für verschiedene Aufgaben gedacht.

Hintergrund:

Swift-Sammlungen wurden mit einem Fokus auf Typensicherheit und Leistung, einschließlich Wertsemantik und Kopieren nach dem Copy-on-Write-Prinzip für Arrays/Sets/Dictionaries, entworfen.

Problem:

Oft verwendet ein unerfahrener Entwickler nur Array dort, wo es angemessener wäre, Set oder Dictionary zu verwenden, was zu speicherintensiven Anwendungen führt und die Geschwindigkeit des Zugriffs/Suchens verringert. Es ist wichtig, die Unterschiede zu verstehen.

Lösung:

Array

Eine geordnete Sammlung von Elementen, Zugriff erfolgt über Index, Duplikate sind möglich. Normalerweise über ein dynamisches Array implementiert.

Set

Eine ungeordnete Sammlung einzigartiger Elemente (Hashable). Zugriff erfolgt über Hash — sehr schnell, Duplikate sind nicht erlaubt.

Dictionary

Eine Sammlung von Schlüssel-Wert-Paaren. Der Schlüssel muss Hashable sein. Zugriff auf den Wert über den Schlüssel (über eine Hash-Tabelle).

Codebeispiel:

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] — Duplikate werden verworfen

Wichtige Merkmale:

  • Array ist effizient für den Zugriff über Index, behält die Reihenfolge bei, aber der Zugriff auf Werte ist linear
  • Set ist schnell für die Suche und Überprüfung der Existenz eines Elements, speichert nur einzigartige Hashable-Werte
  • Dictionary ist optimal für die Suche nach Schlüsseln (Hashable), speichert keine Ordnung, findet und ändert jedoch Werte schnell

Fangfragen.

Kann man non-Hashable Typen als Elemente von Set oder Dictionary verwenden?

Nein. Um in einem Set/Dictionary gespeichert zu werden, muss ein Element Hashable sein (einen einzigartigen Hash-Identifikator haben). Andernfalls lässt der Compiler die Erstellung der Sammlung nicht zu.

struct Point {} // Set<Point> verursacht einen Fehler, da Point nicht Hashable ist

Hat die Reihenfolge der Speicherung von Elementen in Set die gleiche Reihenfolge wie beim Hinzufügen?

Nein. Set garantiert keine Ordnung — die Iteration kann jede Reihenfolge zurückgeben. Wenn Sie eine Reihenfolge benötigen, verwenden Sie Array.

Was passiert, wenn man versucht, auf einen nicht vorhandenen Schlüssel in Dictionary zuzugreifen?

Dictionary gibt ein Optional zurück. Seien Sie vorsichtig — der Versuch, über einen nicht vorhandenen Schlüssel zuzugreifen, gibt nil zurück und keine Fehlermeldung.

let val = dict["not exist"] // val — nil

Typische Fehler und Anti-Patterns

  • Verwendung von Array zur Suche nach einzigartigen Werten (besser Set)
  • Verwendung von Dictionary zur Speicherung von Werten ohne Notwendigkeit der Suche nach Schlüsseln
  • Versuch, non-Hashable Typen als Schlüssel/Werte zu verwenden

Beispiel aus dem Leben

Negativer Fall

Ein Entwickler verwendet Array für eine einzigartige Liste von Benutzern und sucht die Einzigartigkeit über contains. Bei großen Listen — viel Zeit für Prüfungen.

Vorteile:

  • Einfache Implementierung

Nachteile:

  • Lineare Komplexität bei der Suche, übermäßige Speicherung von Duplikaten, hohe Speicherauslastung

Positiver Fall

Die gleiche Liste wird als Set implementiert. Die Überprüfung der Existenz erfolgt sofort, einzigartige Werte sind garantiert.

Vorteile:

  • Schneller Zugriff, Einsparung von Speicher, keine Duplikate

Nachteile:

  • Keine Garantie für die Reihenfolge der Elemente