2015-02-28 11 views
24

Ich bin auf der Suche nach einer Möglichkeit, ein Swift-Array basierend auf einem booleschen Wert zu sortieren.Schnelle Sortierung Array von Objekten auf booleschen Wert

Ich habe es mit einem Guss zu NSArray arbeiten:

var boolSort = NSSortDescriptor(key: "selected", ascending: false) 
var array = NSArray(array: results) 
return array.sortedArrayUsingDescriptors([boolSort]) as! [VDLProfile] 

Aber ich bin für die Swift-Variante suchen, irgendwelche Ideen?

aktualisiert Dank Arkku, ich habe dies mit dem folgenden Code beheben verwaltet:

return results.sorted({ (leftProfile, rightProfile) -> Bool in 
    return leftProfile.selected == true && rightProfile.selected != true 
}) 
+0

re. Update in der Frage, Booleans mit 'true' zu ​​vergleichen ist unnötiges Durcheinander, und es wäre besser Swift Stil, die'() 'um die Schließung wegzulassen (wie es erlaubt ist, wenn die Schließung das letzte Argument ist). – Arkku

Antwort

45

Swift-Arrays anstelle mit sort oder in ein neues Array mit sorted sortiert werden kann. Der einzige Parameter einer Funktion ist ein Abschluss, der zwei Elemente enthält und true zurückgibt, wenn der erste vor dem zweiten angeordnet ist. Der kürzeste Weg, die Parameter des Verschlusses zu verwenden, ist, sie als $0 und $1 zu bezeichnen.

Zum Beispiel (die wahren booleans zuerst zu sortieren):

// In-place: 
array.sort { $0.selected && !$1.selected } 

// To a new array: 
array.sorted { $0.selected && !$1.selected } 

(edit:. Aktualisiert für Swift 3 und 4, die zuvor sortsortInPlace war und sorted war sort)

+0

Danke, mit deiner Antwort habe ich es geschafft, dies in Swift zu beheben. Ich habe meine Frage mit der Antwort aktualisiert. – Antoine

+0

Bitte beachten Sie, dass in Swift 3.0 .sort verwendet wird –

1

Standardbibliothek Swift bietet eine Funktion namens sorted, die ein Array von Werten eines bekannten Typs sortiert, basierend auf der Ausgabe eines Sortierabschlusses, den Sie angeben

reversed wird ein neues Array sein, das nach den im Verschluss angegebenen Bedingungen sortiert wird.

1

New (für Swift 1,2)

return results.sort { $0.selected && !$1.selected } 

alt (für Swift 1,0)

Angenommen results ist vom Typ [VDLProfile] und VDLProfile hat ein Bool Mitglied selected:

return results.sorted { $0.selected < $1.selected } 

S ee Dokumentation für sorted

+2

Dies gab mir einen Fehler: Kann nicht mit einer Argumentliste des Typs 'sortiert' aufgerufen werden. – Antoine

Verwandte Themen