酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Realm Swiftを使って複数の条件でソート(並べ替え)する

本記事では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をまとめておりますのでこちらのページをご参照ください。