Wenn die Array-Elemente Comparable
entsprechen, können Sie einfach die funktionale Syntax verwenden:
array.sort(by: <)
Wenn Sie basierend auf einem benutzerdefinierten Typ sortieren, müssen Sie lediglich den <
-Operator implementieren:
class ImageFile {
let fileName: String
let fileID: Int
let fileSize: Int
static func < (left: ImageFile, right: ImageFile) -> Bool {
return left.fileID < right.fileID
}
}
Manchmal möchten Sie jedoch nicht nur eine Standardmethode zum Vergleichen von ImageFile
s haben. Möglicherweise möchten Sie in bestimmten Kontexten Bilder basierend auf fileID
sortieren und anderswo basierend auf fileSize
. Für dynamische Vergleiche haben Sie zwei Optionen.
images = images.sorted(by: { a, b in
// True zurückgeben, wenn `a` vor `b` im sortierten Array steht
if a.fileID < b.fileID { return true }
if a.fileID > b.fileID { return false }
// Krawatten durch Vergleich von Dateigrößen brechen
return a.fileSize > b.fileSize
})
Sie können die Syntax vereinfachen, indem Sie eine Abschlussklammer verwenden:
images.sorted { ... }
Das manuelle Tippen von if
-Anweisungen kann jedoch zu langem Code führen (wenn wir Dateigrößenknoten brechen möchten, indem wir basierend auf Dateinamen sortieren, würden wir eine ziemlich lange if
-Verkettung haben). Diese Syntax können wir durch Verwendung des brandneuen SortComparator
-Protokolls (macOS 12+, iOS 15+) vermeiden:
sorted(using:)
files = files.sorted(using: [
KeyPathComparator(\.fileID, order: .forward),
KeyPathComparator(\.fileSize, order: .reverse),
])
Dieser Code sortiert die Dateien basierend auf ihrer Datei-ID (.forward
bedeutet aufsteigend) und bricht Knoten, indem er basierend auf der Dateigröße sortiert (.reverse
bedeutet absteigend). Die Syntax \.fileID
ist, wie wir Schlüsselpfade spezifizieren. Sie können die Liste der Vergleicher beliebig erweitern.