Nehmen wir an, ich habe diesen Code:
class Stat {
var statEvents : [StatEvents] = []
}
struct StatEvents {
var name: String
var date: String
var hours: Int
}
var currentStat = Stat()
currentStat.statEvents = [
StatEvents(name: "lunch", date: "01-01-2015", hours: 1),
StatEvents(name: "dinner", date: "01-01-2015", hours: 1),
StatEvents(name: "dinner", date: "01-01-2015", hours: 1),
StatEvents(name: "lunch", date: "01-01-2015", hours: 1),
StatEvents(name: "dinner", date: "01-01-2015", hours: 1)
]
var filteredArray1 : [StatEvents] = []
var filteredArray2 : [StatEvents] = []
Ich könnte die nächste Funktion so oft manuell aufrufen, um 2 Arrays nach "gleichem Namen" zu gruppieren.
filteredArray1 = currentStat.statEvents.filter({$0.name == "dinner"})
filteredArray2 = currentStat.statEvents.filter({$0.name == "lunch"})
Das Problem ist, dass ich den Variablenwert nicht kenne, in diesem Fall "Abendessen" und "Mittagessen". Daher möchte ich dieses Array von statEvents automatisch nach Namen gruppieren, damit ich so viele Arrays erhalte, wie der Name unterschiedlich wird.
Wie könnte ich das machen?
Dictionary
init(grouping:by:)
Initialisierer verwendet.Antworten:
Swift 4:
Seit Swift 4 wurde diese Funktionalität der Standardbibliothek hinzugefügt . Sie können es so verwenden:
Swift 3:
Leider
append
kopiert die obige Funktion das zugrunde liegende Array, anstatt es an Ort und Stelle zu mutieren, was vorzuziehen wäre. Dies führt zu einer ziemlich starken Verlangsamung . Sie können das Problem mithilfe eines Referenztyp-Wrappers umgehen:Obwohl Sie das endgültige Wörterbuch zweimal durchlaufen, ist diese Version in den meisten Fällen immer noch schneller als das Original.
Swift 2:
In Ihrem Fall könnten die "Schlüssel" wie folgt zurückgegeben
keyFunc
werden:Sie erhalten also ein Wörterbuch, in dem jeder Schlüssel ein Name und jeder Wert ein Array der StatEvents mit diesem Namen ist.
Schnell 1
Welches gibt die Ausgabe:
(Der Swiftstub ist hier )
quelle
dict[key]
(in meinem ersten Beispiel wäre es dasans["dinner"]
). Wenn Sie die Indizes der drei Dinge selbst haben möchten, wäre dies ungefähr soenumerate(ans["dinner"])
, oder wenn Sie über die Indizes zugreifen möchten , können Sie dies wie folgt tun:ans["dinner"]?[0]
Dies würde Ihnen das erste Element des Arrays zurückgeben, unter dem gespeichert istdinner
.if case
) ist nicht erforderlich, aber was noch wichtiger ist, das Anhängen an ein in einem Wörterbuch gespeichertes Musterdict[key]?.append)
bewirkt, dass jedes Mal eine Kopie erfolgt. Siehe rosslebeau.com/2016/…Mit Swift 5
Dictionary
wird eine Initialisierungsmethode aufgerufeninit(grouping:by:)
.init(grouping:by:)
hat die folgende Erklärung:Der folgende Spielplatzcode zeigt, wie Sie
init(grouping:by:)
Ihr Problem lösen können:quelle
let dictionary = Dictionary(grouping: statEvents) { $0.name }
- Syntax Sugar CoatingSwift 4: Sie können init (Gruppierung: nach :) von der Apple-Entwicklerseite verwenden
Beispiel :
Also in deinem Fall
quelle
Für Swift 3:
Verwendung:
quelle
In Swift 4 bietet diese Erweiterung die beste Leistung und hilft dabei, Ihre Bediener zu verketten
Beispiel:
erstellt:
quelle
assets.group(by: { $0.coin.uppercased() })
, aber es ist besser zu kartieren als zu gruppierenSie können auch
KeyPath
wie folgt gruppieren :Verwenden des Krypto-Beispiels von @ duan:
Dann sieht die Verwendung folgendermaßen aus:
Das gleiche Ergebnis erzielen:
quelle
Swift 4
quelle
Erweiterung der akzeptierten Antwort, um eine geordnete Gruppierung zu ermöglichen :
Dann funktioniert es mit jedem Tupel :
Sowie jede Struktur oder Klasse :
quelle
Hier ist mein tupelbasierter Ansatz zur Aufrechterhaltung der Ordnung bei Verwendung von Swift 4 KeyPaths als Gruppenvergleicher:
Beispiel für die Verwendung:
quelle
Hey, wenn Sie beim Gruppieren von Elementen anstelle des Hash-Wörterbuchs die Reihenfolge beibehalten müssen, habe ich Tupel verwendet und beim Gruppieren die Reihenfolge der Liste beibehalten.
quelle
Das Wörterbuch (Gruppierung: arr) ist so einfach!
quelle
Ein Blatt aus dem Beispiel "oisdk" nehmen . Erweitern der Lösung zum Gruppieren von Objekten basierend auf dem Klassennamen Demo & Quellcode-Link .
Code-Snippet für die Gruppierung basierend auf dem Klassennamen:
quelle