web-dev-qa-db-ja.com

NSManagedObjectサブクラスのインスタンスを含む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;
    }
}

そして、配列をソートしようとするコードは次のとおりです。

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
}()

そのコードの後半では、エントリの1つの「日付」プロパティにアクセスしてログを記録できますが、コンパイラには問題がありません。

ソートの構文は正しいですか?私が見ていないこのコードには別の問題がありますか?

45
Steven Hovater

これは部分的に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 })
_
124
Mike S

Swift 3では、日付は直接比較可能になりました:

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

if aDate < bDate {

    print("ok")
}

Old Swift:別の方法は、日付オブジェクトのtimeIntervalSince1970プロパティでソートすることです。これは直接比較できます。

days.sort({$0.date.timeIntervalSince1970 < $1.date.timeIntervalSince1970})
16
Fred Faust

Swift2.1このコード行を使用

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

Update__ Swift 4、

let sortedData = dataToSort.sorted(by: { (obj1, obj2) -> Bool in             
   return obj1.date < obj2. date
})
1
Sagar Thukral

キーが日付形式である辞書が1つあるため、日付で辞書をソートする必要があります。 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)
0
Amol Pokale