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无法直接比较<.相反,你可以使用NSDate的compare方法,就像这样:
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)