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の文字列とセレクタを変換するみたいです。 あとはコンパイラがやってくれる。
以上です。