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

Ste*_*ter 45 arrays sorting cocoa core-data swift

我正在尝试对这个问题的接受答案中列出的数组进行排序,但是我遇到了Isuru在对该答案的评论中提到的问题.也就是说,应该通过实体的"日期"属性对数组进行排序的代码会使编译器投诉"无法找到成员'日期'"

这是描述实体的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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
}()
Run Code Online (Sandbox Code Playgroud)

请注意,在该代码的后半部分,我能够访问并记录其中一个条目的"date"属性,并且编译器没有问题.

我的排序语法是否正确?我还没有看到这个代码的另一个问题吗?

Mik*_*e S 124

这部分是Swift编译器没有给你一个有用的错误的问题.真正的问题是NSDate无法直接比较<.相反,你可以使用NSDatecompare方法,就像这样:

days.sort({ $0.date.compare($1.date) == NSComparisonResult.OrderedAscending })
Run Code Online (Sandbox Code Playgroud)

另外,您也可以扩展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 { }
Run Code Online (Sandbox Code Playgroud)

注意:您只需要实现<==上面显示,那么运营的休息<=,>等将通过标准库提供.

有了这个,你的原始排序功能应该工作得很好:

days.sort({ $0.date < $1.date })
Run Code Online (Sandbox Code Playgroud)


Fre*_*ust 16

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

let aDate = Date()
let bDate = Date()

if aDate < bDate {

    print("ok")
}
Run Code Online (Sandbox Code Playgroud)

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

days.sort({$0.date.timeIntervalSince1970 < $1.date.timeIntervalSince1970})
Run Code Online (Sandbox Code Playgroud)


Pha*_*Sai 10

swift2.1使用这行代码

array.sortInPlace({ $0.date.compare($1.date) == NSComparisonResult.OrderedAscending })
Run Code Online (Sandbox Code Playgroud)