本記事ではRealm Swiftを使って複数条件でソートする方法を紹介します。使用しているRealm Swiftのバージョンは v4.4.1 です。
Realm Javaで複数条件のソートしたい場合「Realm Javaを使って複数の条件でソート(並べ替え)する - 酢ろぐ!」の記事をご覧ください。
Realm Swiftを使って複数の条件でソート(並べ替え)する
たとえば User
というオブジェクトがあり、Userクラスは下記のように定義しているとします。
import RealmSwift class User : Object { // ユーザーのID @objc dynamic var id: String = "" // オンライン状態 @objc dynamic var isOnline: Bool = false // 前回のオンライン時刻 @objc dynamic var onlineDate: Date = Date(timeIntervalSince1970: 0) }
このUser
オブジェクトを使って、Realm Swiftでのソートの仕方を紹介します。
単一条件で並び替えをする
Realmではフィールド名を指定してソートをおこないます。
条件が1つの場合のソートです。たとえば id
を基準にして昇順に並べたい場合は、以下のように sorted(byKeyPath:ascending:)
を利用します。
let realm = try! Realm() let results = realm.objects(User.self).sorted(byKeyPath: "id", ascending: true)
次にオンラインのユーザーのみを抽出してから id
順に並び替えします。
let realm = try! Realm() let results = realm.objects(User.self).filter("isOnline == true").sorted(byKeyPath: "id", ascending: true)
複数条件で並び替えをする
前回のオンライン時刻が新しい順(降順)かつIDの古い順(昇順)で並び替えたい場合は以下のように書きます。
let sortProperties = [ SortDescriptor(keyPath: "onlineDate", ascending: false), SortDescriptor(keyPath: "id", ascending: true) ] let realm = try! Realm() let results = realm.objects(User.self).sorted(by: sortProperties)
次にオンラインのユーザーのみを抽出してから複数の条件でソートします。
let sortProperties = [ SortDescriptor(keyPath: "onlineDate", ascending: false), SortDescriptor(keyPath: "id", ascending: true) ] let realm = try! Realm() let results = realm.objects(User.self).filter("isOnline == true").sorted(by: sortProperties)
更新履歴
- 2020/5/1
- Realm Swift v4.4.1をベースに本記事の内容をアップデート
- 2016/2/3
- Realm Swift v0.97.0をベースに本記事を新規作成
関連記事
この他にもiOSアプリ開発で見つけたネタや悩んだ内容など紹介しています。Tipsをまとめておりますのでこちらのページをご参照ください。