Swift3 CoreDataソート実装

ソートについてまとめる
以下の関数を日付でソートしたいとする。

func getData() {
    let context = appDelegate.persistentContainer.viewContext

    do {
        expenses = try context.fetch(Expenses.fetchRequest())
    } catch {
        print("Cannot fetch Expenses")
    }
}

このように記載する。

func getData() {
    let context = appDelegate.persistentContainer.viewContext  

    let fetchRequest = NSFetchRequest<ResultType>(entityName: "Expenses")
    let sort = NSSortDescriptor(key: #keyPath(Expenses.date), ascending: true)
    fetchRequest.sortDescriptors = [sort]
    do {
       expenses = try context.fetch(fetchRequest)
    } catch {
        print("Cannot fetch Expenses")
    }
}

NSFetchRequestがsortDescriptorsというプロパティを持っています。

それをインスタンスにセットするだけです。 ちなみにsortDescriptorsは配列をセットします。
こんな感じです。実装したコード

 fetchRequest.sortDescriptors = [
                NSSortDescriptor(key: "最優先のカラム名" , ascending: true),
                NSSortDescriptor(key: "2番目に優先したいカラム名", ascending: true)]

検索してソートするときに、例えば、男女別でソートして、男子を先に表示する。 その後、生年月日でソートするとかソートには複数の条件が考えられるからです。 sortDescriptorsには、次のようなものをセットできます。

   public init(key: String?, ascending: Bool)
   //キーに文字列、降順、昇順か
   
   public init(key: String?, ascending: Bool, selector: Selector?)

selectorって何?美味しいの?という人のために、、

selectorは、処理先のメソッドを指定するもの。
例えば、

selector: #selector(ViewController.hoge(_:)),

と引数で指定したときは、その呼び出す関数を@objつけて記載する。

@objc func hoge(_ sender:Timer) -> Void {
    print("タイマー実行")
}

こんな感じ。 Objective-Cではポインターだったけど、swiftでは構造体となっているので、このように記載しないといけない。 Objective-Cの文字列とセレクタを変換するみたいです。 あとはコンパイラがやってくれる。

以上です。