2015-02-28 13 views
24

Sto cercando un modo per ordinare un array Swift in base a un valore booleano.Ordinare rapidamente una matrice di oggetti in base al valore booleano

ce l'ho a lavorare con un cast di NSArray:

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

Ma io sto cercando la variante Swift, tutte le idee?

Aggiornamento Grazie a Arkku, sono riuscito a risolvere il problema utilizzando il seguente codice:

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

ri. aggiorna nella domanda, confrontando i booleani con 'true' non è necessario il clutter, e sarebbe meglio lo stile di Swift per omettere il'() 'attorno alla chiusura (come è permesso quando la chiusura è l'ultimo argomento). – Arkku

risposta

45

array di Swift possono essere ordinati in atto con sort o per un nuovo array con sorted. Il singolo parametro di entrambe le funzioni è una chiusura che prende due elementi e restituisce true se il primo è ordinato prima del secondo. Il modo più breve per utilizzare i parametri della chiusura è riferendosi ad essi come $0 e $1.

Per esempio (per ordinare i veri booleani prima):

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

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

(edit:. Aggiornato per Swift 3 e 4, in precedenza sort era sortInPlace e sorted era sort) libreria standard

+0

Grazie, usando la tua risposta, sono riuscito a risolvere il problema in Swift. Ho aggiornato la mia domanda con la risposta. – Antoine

+0

Si noti che in Swift 3.0 .sort è utilizzato –

1

di Swift ™ fornisce una funzione denominata ordinata, che ordina una matrice di valori di un tipo noto, in base all'output di una chiusura di ordinamento che viene fornita

reversed sarà un nuovo array che verrà ordinato in base alle condizioni indicate nella chiusura.

1

Nuova (per Swift 1,2)

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

Vecchio (per Swift 1,0)

Assumendo results è di tipo [VDLProfile] e VDLProfile ha un Bool membro selected:

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

S documentazione ee per sorted

+2

Questo mi ha dato un errore: Impossibile richiamare 'ordinati' con un elenco di argomenti di tipo. – Antoine

Problemi correlati