RealmSwift
iOS アプリで利用できる軽量データベースフレームワーク。
これが最近アップデートされて SwiftUI にどうやら正式対応したらしい。
というのも、以前からでも SwiftUI で RealmSwift は利用できたのだがリストを ForEach で回して表示しているときにremoveメソッドでリストを削除しようとすると、SwiftUI 側と RealmSwift 側でデータを削除するタイミングがずれてしまうので SwiftUI が「アクセスしようとしたデータがないんだが」というエラーがでてクラッシュしてしまっていた。
これは Realm5.0 で追加されたfreeze()を使えば常にimmutableなオブジェクトを返し、クラッシュすることがないようにできたのだがいささか実装がめんどくさかった。
ObservedResults
そんな中現れたのがObservedResultsで、これは RealmSwift で公式サポートされている機能である。
struct ContactsView: View { @ObservedResults(Person.self) var persons
var body: some View { List { ForEach(persons) { person in Text(person.name) } .onMove(perform: $persons.move) .onDelete(perform: $persons.remove) }.navigationBarItems(trailing: Button("Add") { $persons.append(Person()) } ) }}で、それを使えば削除するメソッドがこんなに簡単にかけてしまう!!
::: warning onMove
ただ、onMoveはこの書き方では動作しないので注意。
:::
しかもこれ、便利なことにpersonsに対してfilterなどを書けても正しく動作する。便利すぎる!!!