Arrays 如何根据属性值(日期)对包含NSManagedObject子类实例的swift数组进行排序
我试图对数组进行排序,如中所述,但遇到了Isuru在对该答案的评论中提到的问题。也就是说,根据实体的“date”属性对数组进行排序的代码会导致编译器抱怨“找不到成员'date'” 下面是描述实体的NSManagedObject子类:Arrays 如何根据属性值(日期)对包含NSManagedObject子类实例的swift数组进行排序,arrays,cocoa,sorting,core-data,swift,Arrays,Cocoa,Sorting,Core Data,Swift,我试图对数组进行排序,如中所述,但遇到了Isuru在对该答案的评论中提到的问题。也就是说,根据实体的“date”属性对数组进行排序的代码会导致编译器抱怨“找不到成员'date'” 下面是描述实体的NSManagedObject子类: import Foundation import CoreData @objc(Entry) class Entry: NSManagedObject { @NSManaged var date: NSDate @NSManaged var re
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
}()
lazy var条目:[Entry]={
变量天数:[Entry]=self.managedObjectContext!.requestEntity(“Entry”)作为[Entry]
排序({$0.date<$1.date})
var today:Entry=days.last!
println(今天,日期)
回归日
}()
请注意,在该代码的后半部分中,我能够访问并记录其中一个条目的“date”属性,编译器对此没有问题
我的排序语法正确吗?这段代码还有其他问题吗?这部分是因为Swift编译器没有给您提供有用的错误。真正的问题是,
NSDate
无法与Swift 3中的进行比较,现在日期可以直接比较:
let aDate = Date()
let bDate = Date()
if aDate < bDate {
print("ok")
}
let aDate=Date()
设bDate=Date()
如果aDate
老斯威夫特:
另一种方法是根据date对象的timeIntervalSince1970属性进行排序,该属性是直接可比较的
days.sort({$0.date.timeIntervalSince1970 < $1.date.timeIntervalSince1970})
days.sort({$0.date.timeIntervalSince1970<$1.date.timeIntervalSince1970})
在swift2.1
中使用以下代码行
array.sortInPlace({ $0.date.compare($1.date) == NSComparisonResult.OrderedAscending })
我有一本字典,它的键是日期格式的,所以我必须按日期对字典进行排序。我复制了nsarray中的所有键,然后使用以下代码对该数组进行排序
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)
更新斯威夫特4号
let sortedData = dataToSort.sorted(by: { (obj1, obj2) -> Bool in
return obj1.date < obj2. date
})
let sortedData=dataToSort.sorted(按:{(obj1,obj2)->Bool-in
返回obj1.date
这非常适用于数据量较小的情况,但如果数据量较大,则需要一段时间才能加载。有没有更有效的方法?@nsij22因为我们在这里讨论的是NSManagedObject
s,那么这些对象可能来自核心数据存储。在这种情况下,最有效的方法可能是通过核心数据获取请求对数据进行排序。看看NSFetchRequest.sortDescriptors
:我只是在我需要同样的东西并看到接受答案的第一句话时才想到它,这比接受答案发布时要晚得多。
array.sortInPlace({ $0.date.compare($1.date) == NSComparisonResult.OrderedAscending })
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)
let sortedData = dataToSort.sorted(by: { (obj1, obj2) -> Bool in
return obj1.date < obj2. date
})