Nehmen wir an, wir haben eine benutzerdefinierte Klasse namens imageFile und diese Klasse enthält zwei Eigenschaften.
class imageFile {
var fileName = String()
var fileID = Int()
}
viele von ihnen in Array gespeichert
var images : Array = []
var aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 101
images.append(aImage)
aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 202
images.append(aImage)
Die Frage ist: Wie kann ich das Bildarray nach 'fileID' ASC oder DESC sortieren?
Antworten:
Deklarieren Sie zunächst Ihr Array als typisiertes Array, damit Sie beim Iterieren Methoden aufrufen können:
Dann können Sie einfach tun:
Swift 2
Swift 3+
Das obige Beispiel gibt die Reihenfolge der Sortierung ab
quelle
NSManagedObject
Unterklasse namens CheckInAndOut . In einer separaten Datei habe ich ein typisiertes Array für Objekte dieses Typs deklariert. Wenn ich versuche, es zu sortieren , wird der Fehler " Mitglied konnte nicht gefunden werden" angezeigt. Irgendeine Idee warum das so ist?firstName
undlastName
in einem Array vonPerson
Objekten. Zuerst möchte ich es sortierenfirstName
und dannlastName
. Wie kann ich das machen?images.sortInPlace({ $0.fileID > $1.fileID })
?[ Aktualisiert für Swift 3 mit sort (by :) ] Dies nutzt einen nachfolgenden Abschluss aus:
wo Sie verwenden
<
oder>
abhängig von ASC bzw. DESC. Wenn Sie dasimages
Array ändern möchten , verwenden Sie Folgendes:Wenn Sie dies wiederholt tun und lieber eine Funktion definieren möchten, haben Sie folgende Möglichkeiten:
und dann verwenden als:
quelle
sort
Kompiliert nicht mehr mit dieser Syntax in Xcode 8. Xcode 8 sagt, dass$0.fileID < $1.fileID
ein Bool nicht ComparisonResult erzeugt wird.Fast jeder gibt an, wie direkt, lassen Sie mich die Entwicklung zeigen:
Sie können die Instanzmethoden von Array verwenden:
Ausführliche Erläuterungen zum Funktionsprinzip der Sortierung finden Sie unter Die sortierte Funktion .
quelle
Swift 3
quelle
people.sort { $0.email > $1.email }
Mit Swift 5
Array
hat zwei Methoden aufgerufensorted()
undsorted(by:)
. Die erste Methodesorted()
hat die folgende Deklaration:Die zweite Methode
sorted(by:)
hat die folgende Deklaration:# 1. Sortieren Sie in aufsteigender Reihenfolge nach vergleichbaren Objekten
Wenn der Elementtyp in Ihrer Sammlung dem
Comparable
Protokoll entspricht , können Siesorted()
Ihre Elemente in aufsteigender Reihenfolge sortieren. Der folgende Spielplatzcode zeigt die Verwendungsorted()
:# 2. Sortieren Sie in absteigender Reihenfolge nach vergleichbaren Objekten
Wenn der Elementtyp in Ihrer Sammlung dem
Comparable
Protokoll entspricht , müssen Sie ihn verwendensorted(by:)
, um Ihre Elemente in absteigender Reihenfolge zu sortieren.#3. Für nicht vergleichbare Objekte in aufsteigender oder absteigender Reihenfolge sortieren
Wenn der Elementtyp in Ihrer Sammlung NICHT dem
Comparable
Protokoll entspricht, müssen Sie ihn verwendensorted(by:)
, um Ihre Elemente in aufsteigender oder absteigender Reihenfolge zu sortieren.Beachten Sie, dass Swift auch zwei Methoden bereitstellt, die als
sort()
undsort(by:)
als Gegenstücke zusorted()
undsorted(by:)
wenn Sie Ihre Sammlung direkt sortieren müssen.quelle
In Swift 3.0
quelle
Sie können auch so etwas tun
So wird Ihr Bildarray sortiert gespeichert
quelle
Swift 2 bis 4
In der ursprünglichen Antwort wurde versucht, ein Array von benutzerdefinierten Objekten mithilfe einer Eigenschaft zu sortieren. Im Folgenden werde ich Ihnen einige praktische Möglichkeiten zeigen, wie Sie dasselbe Verhalten mit schnellen Datenstrukturen ausführen können!
Kleinigkeiten aus dem Weg, ich habe ImageFile ganz leicht verändert. In diesem Sinne erstelle ich ein Array mit drei Bilddateien. Beachten Sie, dass Metadaten ein optionaler Wert sind und als Parameter nil übergeben wird.
ImageFile hat eine Eigenschaft namens size. In den folgenden Beispielen werde ich Ihnen zeigen, wie Sie Sortieroperationen mit Eigenschaften wie Größe verwenden.
kleinste bis größte Größe (<)
größte bis kleinste (>)
Als nächstes sortieren wir nach dem Namen der String-Eigenschaft. Verwenden Sie auf die gleiche Weise sort, um Zeichenfolgen zu vergleichen. Beachten Sie jedoch, dass der innere Block ein Vergleichsergebnis zurückgibt. Dieses Ergebnis definiert die Sortierung.
AZ (.orderedAscending)
ZA (.orderedDescending)
Als nächstes sortiere ich am liebsten. In vielen Fällen verfügt man über optionale Eigenschaften. Jetzt mach dir keine Sorgen, wir werden auf die gleiche Weise wie oben sortieren, außer dass wir mit Null umgehen müssen! In Produktion;
Ich habe diesen Code verwendet, um zu erzwingen, dass alle Instanzen in meinem Array mit Null-Eigenschaftswerten zuletzt sind. Ordnen Sie dann Metadaten unter Verwendung der angenommenen nicht verpackten Werte.
Es ist möglich, eine sekundäre Sortierung für Optionen zu haben. Zum Beispiel; man könnte Bilder mit Metadaten zeigen und nach Größe sortieren.
quelle
Zwei Alternativen
1) Bestellen des ursprünglichen Arrays mit sortInPlace
2) Verwenden eines alternativen Arrays zum Speichern des geordneten Arrays
quelle
var assignmentsO : [Assignment]
, es zu verwenden oder zu einer Zeile zu kombinieren, indem Sielet assignmentsO = self.assignments.sort({ $0.order < $1.order })
Swift 4.0, 4.1 & 4.2 Zuerst habe ich ein veränderliches Array vom Typ imageFile () erstellt, wie unten gezeigt
Erstellen Sie ein veränderbares Objektbild vom Typ imageFile () und weisen Sie den Eigenschaften wie unten gezeigt einen Wert zu
Hängen Sie dieses Objekt nun an das Array arr an
Weisen Sie nun die verschiedenen Eigenschaften demselben veränderlichen Objekt zu, dh dem Bild
Fügen Sie nun erneut das Bildobjekt an das Array arr an
Jetzt wenden wir aufsteigende Reihenfolge auf die fileId- Eigenschaft in Array-Arr-Objekten an. Verwenden Sie das Symbol < für aufsteigende Reihenfolge
Jetzt wenden wir die absteigende Reihenfolge auf die Eigenschaft fileId in Array-Arr-Objekten an. Verwenden Sie das Symbol> für absteigende Reihenfolge
In Swift 4.1. & 4.2 Für sortierte Bestellungen verwenden
quelle
Wenn Sie dieses Array an mehreren Stellen sortieren, ist es möglicherweise sinnvoll, Ihren Array-Typ vergleichbar zu machen.
quelle
Wenn Sie keine benutzerdefinierten Objekte verwenden, sondern stattdessen Werttypen, die das vergleichbare Protokoll (Int, String usw.) implementieren, können Sie dies einfach tun:
Ein Beispiel:
quelle
myArray.sorted(by: >)
Sie geben ein sortiertes Array aus der fileID-Eigenschaft folgendermaßen zurück:
Swift 2
Swift 3 ODER 4
Swift 5.0
quelle
Ich mache es so und es funktioniert:
var images = [imageFile]() images.sorted(by: {$0.fileID.compare($1.fileID) == .orderedAscending })
quelle
Wenn Sie das ursprüngliche Array von benutzerdefinierten Objekten sortieren möchten. Hier ist eine andere Möglichkeit, dies in Swift 2.1 zu tun
Wo
id
ist eine ganze Zahl? Sie können denselben<
Operator auch fürString
Eigenschaften verwenden.Weitere Informationen zur Verwendung finden Sie in einem Beispiel hier: Swift2: Kunden in der Nähe
quelle
Drucke:
"["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"
quelle
Schnelle 3 & 4 & 5
Ich hatte ein Problem mit Klein- und Großbuchstaben
Also habe ich diesen Code gemacht
und verwenden Sie danach sortierte Bilder
quelle
Sortieren mit KeyPath
Sie können folgendermaßen sortieren
KeyPath
:Durch die Implementierung dieser kleinen hilfreichen Erweiterung.
Hoffe, Swift fügt dies in naher Zukunft in den Kern der Sprache ein.
quelle
public extension MutableCollection where Self: RandomAccessCollection { mutating func sort<T>(_ keyPath: KeyPath<Element, T>, by areInIncreasingOrder: (T, T) throws -> Bool) rethrows where T: Comparable { try sort { try areInIncreasingOrder($0[keyPath: keyPath], $1[keyPath: keyPath]) } }}