Swift 2 bis 4
Die ursprüngliche Antwort suchte nach einer Möglichkeit, ein Array von benutzerdefinierten Objekten nach einer Eigenschaft zu sortieren. Nachfolgend zeige ich Ihnen ein paar praktische Möglichkeiten, um dieses Verhalten mit Swift-Datenstrukturen zu erreichen!
Zuerst einmal habe ich ImageFile ein klein wenig geändert. In diesem Sinne erstelle ich ein Array mit drei Bilddateien. Beachten Sie, dass metadata ein optionaler Wert ist und das Eingeben von nil als Parameter erwartet wird.
struct ImageFile {
var name: String
var metadata: String?
var size: Int
}
var images: [ImageFile] = [ImageFile(name: "HalloWelt", metadata: nil, size: 256), ImageFile(name: "Reisende Verkäufer", metadata: "ähm, das ist riesig", size: 1024), ImageFile(name: "Slack", metadata: "was ist da drin?", size: 2048) ]
ImageFile hat eine Eigenschaft namens size. Für die folgenden Beispiele werde ich Ihnen zeigen, wie Sie Sortieroperationen mit Eigenschaften wie size durchführen können.
Kleinste bis größte Größe (<)
let sizeKleinstsortiert = images.sorted { (initial, next) -> Bool in
return initial.size < next.size
}
Größte bis kleinste Größe (>)
let sizeGrößtsortiert = images.sorted { (initial, next) -> Bool in
return initial.size > next.size
}
Anschließend werden wir nach der String-Eigenschaft name sortieren. Genauso wie bei den Zahlen verwenden Sie sort, um Strings zu vergleichen. Beachten Sie jedoch, dass der innere Block ein Vergleichsergebnis zurückgibt. Dieses Ergebnis wird die Sortierung definieren.
A-Z (.orderedAscending)
let nameAufsteigendsortiert = images.sorted { (initial, next) -> Bool in
return initial.name.compare(next.name) == .orderedAscending
}
Z-A (.orderedDescending)
let nameAbsteigendsortiert = images.sorted { (initial, next) -> Bool in
return initial.name.compare(next.name) == .orderedDescending
}
Als nächstes folgt meine bevorzugte Art der Sortierung. In vielen Fällen können optionale Eigenschaften vorhanden sein. Keine Sorge, wir werden genauso wie oben sortieren, außer dass wir mit Nil umgehen müssen! In der Produktion;
Ich habe diesen Code verwendet, um alle Instanzen in meinem Array mit Nil-Werteigenschaften ganz nach hinten zu drängen. Anschließend wird metadata unter Verwendung der angenommenen ausgepackten Werte sortiert.
let metadataZuerst = images.sorted { (initial, next) -> Bool in
guard initial.metadata != nil else { return true }
guard next.metadata != nil else { return true }
return initial.metadata!.compare(next.metadata!) == .orderedAscending
}
Es ist möglich, eine sekundäre Sortierung für Optionale durchzuführen. Zum Beispiel könnten Bilder mit Metadaten angezeigt und nach Größe sortiert werden.