📌

RealmSwift での絞り込みは filter を使わず where を使おう

2023/03/21に公開

RealmSwift での絞り込みに関して調べると、filter() が紹介されていることが多いです。
しかし現在はこの方法は推奨されていません。
10.19.0以降では where() というAPIが推奨されています。
https://github.com/realm/realm-swift/releases/tag/v10.19.0

この記事では filter() の問題点と、 where() の使い方を紹介したいと思います。

filter() の問題点

例えば以下のようなエンティティを取り扱うとします。

class Dog: Object {
   @Persisted var name: String = ""
}

taroname に持つ Dogfileter() で絞り込んでみます。

let realm = try! Realm()
let dogs = realm.objects(Dog.self).filter('nam == %@', "taro")

このソースコードは namenam にタイポしていますが、コンパイルは通ってしまいます。
実行時にはエラーになるのですが、間違いに気づくまでに時間がかかります。
このように fileter を使うと、 String で検索条件を書くことになるため、コンパイル時に間違いに気づけなくなります。

where() の使い方

そこで登場したのが where() になります。
where() を使って同じコードを書いてみましょう。

let realm = try! Realm()
let dogs = realm.objects(Dog.self).where({ $0.nam == "taro" })

今回も namenam にタイポしていますが、 where()Dog を参照しているため、コンパイル時にエラーとなります。
正しいソースコードは以下の通りです。

let realm = try! Realm()
let dogs = realm.objects(Dog.self).where({ $0.name == "taro" })

if 文などと同じように条件を書けるのも良いところですね。
また、複雑なクエリもプロパティを直接参照出来るので書きやすいかと思います。

参考リンク

https://www.mongodb.com/developer/products/realm/realm-swift-query-api/

Discussion