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:
Eine geordnete Sammlung von Elementen, Zugriff erfolgt über Index, Duplikate sind möglich. Normalerweise über ein dynamisches Array implementiert.
Eine ungeordnete Sammlung einzigartiger Elemente (Hashable). Zugriff erfolgt über Hash — sehr schnell, Duplikate sind nicht erlaubt.
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:
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
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:
Nachteile:
Die gleiche Liste wird als Set implementiert. Die Überprüfung der Existenz erfolgt sofort, einzigartige Werte sind garantiert.
Vorteile:
Nachteile: