如何sorting包含NSManagedObject子类的实例的swift数组(按date)

我试图对接受的这个问题的答案中列出的一个数组进行sorting,但是却碰到了Isuru在这个答案的评论中提到的问题。 也就是说,应该通过实体的“date”属性对数组进行sorting的代码会使编译器投诉“找不到成员'date'”

下面是描述实体的NSManagedObject子类:

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; } } 

这里是试图sorting数组的代码:

 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 }() 

请注意,在该代码的后半部分中,我可以访问和logging其中一个条目的“date”属性,并且编译器没有问题。

我的sorting语法正确吗? 这个代码有没有另外一个问题,我没有看到?

这是Swift编译器不给你一个有用的错误的一个部分问题。 真正的问题是NSDate不能与<直接进行比较。 相反,你可以使用NSDatecompare方法,如下所示:

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

或者,您可以扩展NSDate以实现可Comparable协议,以便可以与< (和<=>>=== )进行比较:

 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 { } 

注意:你只需要实现<== ,如上图所示,其余的运算符<=>等将由标准库提供。

有了这个,你原来的sortingfunction应该工作得很好:

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

在Swift 3中,date现在可以直接比较:

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

旧的swift:另一种方法是对date对象的timeIntervalSince1970属性进行sorting,这是直接可比较的。

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

swift2.1使用这行代码

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

我有一个字典的键是在date格式,所以我必须按datesorting字典。 我复制了nsarray中的所有键,然后使用下面的代码对该数组进行sorting。

 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)