3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

swiftでListしたRealmデータを削除するとクラッシュの件:Index 1 is out of bounds

Posted at

Realmに保存したデータをListで表示、
Cellごとに閲覧、編集、削除できるようにしたい。

と思っていましたが、削除する度に
Index 1 is out of bounds (must be less than 1)が出てクラッシュ。
長い間いろいろ英語の文章を参照したのですが、解決できなかった。

久しぶりに調べてみたら、この記事が救ってくれました。
https://llcc.hatenablog.com/entry/2020/04/26/205254

私のような新人の理解では、本来Listを出すには直接Realmへデータを取りに行くんですが、
今度は、ListのCellに対するView Modelを作り、View全体もView Modelを作り、
Listを出すにはViewModel経由で取得、

ForEach(model.myModels, id: .id)

ForEach(model.cellModels, id: .id)
もう削除したデータ、存在しないデータへ取りに行くことは発生しない

中身はこんな感じ:

private var token: NotificationToken?
    private var myModelResults = try? Realm().objects(MyModel.self)
    @Published var myModels: [MyModel] = []
    
    init() {
        token = myModelResults?.observe { [weak self] _ in
            self?.myModels = self?.myModelResults?.map { $0 } ?? []
        }
    }
    
    deinit {
        token?.invalidate()
    }
ForEach(model.myModels, id: \.id) 

を以下へ変更

private var token: NotificationToken?
    private var myModelResults = try? Realm().objects(MyModel.self)
    @Published var cellModels: [ContentViewCellModel] = []
    
    init() {
        token = myModelResults?.observe { [weak self] _ in
            self?.cellModels = self?.myModelResults?.map { ContentViewCellModel(id: $0.id, title: $0.title) } ?? []
        }
    }
    
    deinit {
        token?.invalidate()
    }
ForEach(model.cellModels, id: \.id)  

このようにしたら、エラーが綺麗に解消できました。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?