一尘不染

如何按属性值(日期)对包含NSManagedObject子类实例的swift数组进行排序

swift

我正在尝试对这个问题的可接受答案中列出的数组进行排序,但是遇到了Isuru在对该答案的评论中提到的问题。即,应按实体的“date”属性对数组进行排序的代码使编译器投诉“找不到成员’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;
    }
}

这是尝试对数组进行排序的代码:

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

请注意,在该代码的后半部分,我能够访问和记录其中一个条目的“ date”属性,并且编译器对此没有任何问题。

我的排序语法正确吗?我没有看到此代码还有其他问题吗?


阅读 461

收藏
2020-07-07

共1个答案

一尘不染

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

注意: 您只需要实现<==上面显示,然后休息运营商<=>等会通过标准库提供。

有了它,您原来的排序功能应该可以正常工作:

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