Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何根据属性值(日期)对包含NSManagedObject子类实例的swift数组进行排序_Arrays_Cocoa_Sorting_Core Data_Swift - Fatal编程技术网

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

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

我试图对数组进行排序,如中所述,但遇到了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
}()
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
})