Cómo ordeno una matriz rápida que contiene instancias de la subclase NSManagedObject por un valor de atributo (fecha)

Estoy tratando de ordenar una matriz como se establece en la respuesta aceptada a esta pregunta , pero me estoy encontrando con el problema que Isuru menciona en los comentarios sobre esa respuesta. A saber, el código que debe ordenar la matriz por el atributo “fecha” de la entidad trae la queja del comstackdor “no se pudo encontrar la fecha del miembro”.

Aquí está la subclase NSManagedObject que describe la entidad:

import Foundation import CoreData @objc(Entry) class Entry: NSManagedObject { @NSManaged var date: NSDate @NSManaged var reflections: AnyObject @NSManaged var contactComment: NSSet @NSManaged var person: NSSet override func awakeFromInsert() { let now:NSDate = NSDate() self.date = now; } } 

Y aquí está el código que intenta ordenar la matriz:

 lazy var entries:[Entry] = { var days:[Entry] = self.managedObjectContext!.requestEntity("Entry")as [Entry] days.sort({$0.date < $1.date}) var today:Entry = days.last! println(today.date) return days }() 

Tenga en cuenta que en la última parte de ese código, puedo acceder y registrar la propiedad “fecha” para una de las entradas, y el comstackdor no tiene un problema con ella.

¿Mi syntax para ordenar es correcta? ¿Hay algún otro problema con este código que no estoy viendo?

Esto es en parte un problema con el comstackdor de Swift que no le ofrece un error útil. El verdadero problema es que NSDate no se puede comparar con < directamente. En cambio, puede usar el método de compare NSDate , así:

 days.sort({ $0.date.compare($1.date) == NSComparisonResult.OrderedAscending }) 

Alternativamente, puede extender NSDate para implementar el protocolo Comparable para que se pueda comparar con < (y <= , > , >= , == ):

 public func <(a: NSDate, b: NSDate) -> Bool { return a.compare(b) == NSComparisonResult.OrderedAscending } public func ==(a: NSDate, b: NSDate) -> Bool { return a.compare(b) == NSComparisonResult.OrderedSame } extension NSDate: Comparable { } 

Nota: Solo necesita implementar < y == y se muestra arriba, luego el rest de los operadores <= , > , etc. serán provistos por la biblioteca estándar.

Con eso en su lugar, su función de clasificación original debería funcionar bien:

 days.sort({ $0.date < $1.date }) 

En Swift 3, las fechas ahora son directamente comparables:

 let aDate = Date() let bDate = Date() if aDate < bDate { print("ok") } 

Old swift: una alternativa sería ordenar en la propiedad timeIntervalSince1970 del objeto date, que es directamente comparable.

 days.sort({$0.date.timeIntervalSince1970 < $1.date.timeIntervalSince1970}) 

En swift2.1 usa estas líneas de código

 array.sortInPlace({ $0.date.compare($1.date) == NSComparisonResult.OrderedAscending }) 

Tengo un diccionario cuyas claves están en el formato de fecha, así que tengo que ordenar el diccionario por fecha. Copié todas las claves en nsarray y luego ordené esa matriz usando el siguiente código.

 let keys : NSArray = stackedBarDataDict.allKeys // stackedBarDataDict is Data Dictionary let dataArray = NSMutableArray() for index in 0...(stackedBarDataDict.allKeys.count - 1) { let dateone = keys.objectAtIndex(index) let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" let date1 = dateFormatter.dateFromString(dateone as! String) dataArray.addObject(date1!) } let array : NSArray = (dataArray as NSArray) let sortedArray = array.sortedArrayUsingComparator { (obj1, obj2) -> NSComparisonResult in let p1 = obj1 as! NSDate let p2 = obj2 as! NSDate let result = p1.compare(p2) return result } print(sortedArray)