Quantumleap
342 words
2 minutes
RealmCocoaがSwiftUIに正式対応してるっぽい

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などを書けても正しく動作する。便利すぎる!!!

RealmCocoaがSwiftUIに正式対応してるっぽい
https://fuwari.vercel.app/posts/2021/08/realmcocoa/
Author
tkgling
Published at
2021-08-05