2015-07-30 3 views
39

In Swift 2.0, come procederesti nell'ordinamento di una matrice di oggetti personalizzati da una proprietà? Lo so in Swift 1.2, questo è stato fatto usando sort() e sort(). Tuttavia, questi metodi non funzionano più in Xcode 7 beta 4. Grazie!Swift 2.0 Ordinamento di matrici di oggetti per proprietà

Ad esempio:

class MyObject: NSObject { 
    var myDate : NSDate 
} 

... 

let myObject1 : MyObject = MyObject() //same thing for myObject2, myObject3 

var myArray : [MyObject] = [myObject1, myObject2, myObject3] 

//now, I want to sort myArray by the myDate property of MyObject. 
+0

C'è sempre il tipo di bolla. – SalmonKiller

risposta

76

In Swift 2:

  • È possibile utilizzare sort metodo, utilizzando compare per confrontare le due date:

    let sortedArray = myArray.sort { $0.myDate.compare($1.myDate) == .OrderedAscending } // use `sorted` in Swift 1.2 
    
  • Oppure, se si desidera ordinare la matrice originale, è possibile sortInPlace:

    myArray.sortInPlace { $0.myDate.compare($1.myDate) == .OrderedAscending } // use `sort` in Swift 1.2 
    

In Swift 3:

  • per restituire una resa ordinato della matrice, utilizzare sorted, non sort

    let sortedArray = myArray.sorted { $0.myDate < $1.myDate } 
    
  • per ordinare in posto, è ora solo sort:

    myArray.sort { $0.myDate < $1.myDate } 
    

E con il tipo Date di Swift 3, è possibile utilizzare l'operatore <.

+0

Esempio di ordinamento di stringhe let myArray = ["Zen", "Step 12", "Apple"] let sortedArray = myArray.sort ({x, y in return x.localizedStandardCompare (y) == NSComparisonResult.OrderedAscending }) dump (sortedArray) – Abhijeet

+0

swift 3 non funziona –

+0

La versione di Swift 3 funziona correttamente. Sospetto che ci sia qualcos'altro che non va nel tuo codice. Se hai ancora problemi, pubblica la tua nuova domanda su Stack Overflow con [esempio riproducibile del tuo problema] (http://stackoverflow.com/help/mcve). – Rob

-2

ordinamento è ora sortInPlace (o simili) con gli stessi parametri di ordinamento.

10

Se si desidera ordinare la matrice originale di oggetti personalizzati. Ecco un altro modo per farlo in Swift 2,1

var myCustomerArray = [Customer]() 
myCustomerArray.sortInPlace {(customer1:Customer, customer2:Customer) -> Bool in 
     customer1.id < customer2.id 
    } 

Dove id è un numero intero. È possibile utilizzare lo stesso operatore < per String.

Potete saperne di più sul suo utilizzo, cercando in un esempio qui: Swift2: Nearby Customers

+0

Anche questo può essere ancora più corto. Usando $ 0 e $ 1 –

0

a Swift 3.0

ho preso l'ipotesi stessa come l'esempio richiesto nella domanda.

i.e customObject è MyObject con myDate variabile. L'array di MyObject è myArray.Possiamo ordinare in questo modo semplicemente.

myArray.sort(by: { (one: MyObject, two: MyObject) -> Bool in 
    one. myDate < two. myDate 
})