2014-10-26 52 views
43

我試圖按照the accepted answer to this question中列出的排列數組,但我遇到了Isuru在該評論中提到的問題回答。也就是說,它應該由實體的「日期」的屬性數組排序的代碼帶來的編譯器抱怨「找不到成員‘日期’」我如何排序一個包含NSManagedObject子類的實例的swift數組的一個屬性值(日期)

這裏是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 
}() 

注意,在該代碼的後半部分,我能夠針對這些項目的一個訪問,並記錄「日期」的屬性,並且編譯器沒有按它沒有問題。

是我的排序正確的語法?這段代碼還有其他問題,我沒有看到?

回答

124

這是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 }) 
+0

這適用於較小的數據量,但如果數量較大,需要一段時間才能加載。有沒有更有效的方法? – nsij22 2015-06-03 14:28:14

+0

@ nsij22因爲我們在這裏說'NSManagedObject's,那麼這些對象可能來自核心數據存儲。在這種情況下,最有效的做法可能是通過核心數據提取請求對數據進行排序。看看'NSFetchRequest.sortDescriptors':https://developer.apple.com/library/mac/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/index.html#//apple_ref/occ/instp/NSFetchRequest/ sortDescriptors – 2015-06-04 00:10:47

16

在斯威夫特3,日期現在直接可比性:

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

if aDate < bDate { 

    print("ok") 
} 

舊迅速: 另一種做法可以對日期對象的timeIntervalSince1970屬性進行排序,這是直接可比較的。

days.sort({$0.date.timeIntervalSince1970 < $1.date.timeIntervalSince1970}) 
+0

我不知道爲什麼這不是被接受的解決方案 – 2016-02-12 12:15:44

+0

我只想到它,當我需要相同的東西,並看到接受的答案的第一句話,這是比公佈的答案晚得多。 – 2016-02-12 12:25:15

10

swift2.1使用此線具有一個詞典,其關鍵字是日期格式所以我必須按日期排序的詞典我代碼

array.sortInPlace({ $0.date.compare($1.date) == NSComparisonResult.OrderedAscending }) 
0

。我複製了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) 
相關問題