前提・実現したいこと
Realmのデータベースをもとにした並び替え可能なTableViewを作成したいです
RealmのデータベースはResults型で、並び替えに用いるremoveやinsertが使えないので、一度Arrayに変換して、removeやinsertを用いて並び替えをし、for文を用いてRealmのデータベースを上書きしたいのですが、for文の中でArrayの中身が変わってしまい、正しく上書きされません
発生している問題・エラーメッセージ
例えば、tab1, tab2, tab3, tab4という4つのセルがあり、tab1をtab4のところに持っていくと、for文の中で配列の中身が次のように変わっていってしまいます
1周目 正しい
[0]name = tab2
[1]name = tab3
[2]name = tab4
[3]name = tab1
2周目 [3]tab1 -> tab2
[0]name = tab2
[1]name = tab3
[2]name = tab4
[3]name = tab2
3周目 [0]tab2 -> tab3
[0]name = tab3
[1]name = tab3
[2]name = tab4
[3]name = tab2
4周目 [1]tab3 -> tab4
[0]name = tab3
[1]name = tab4
[2]name = tab4
[3]name = tab2
該当のソースコード
class Tab: Object { @objc dynamic var name = "" }
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { let realm = try! Realm() let tabObjects = realm.objects(Tab.self) var tabArray = Array(tabObjects) let sourceTab = tabArray[sourceIndexPath.row] tabArray.remove(at: sourceIndexPath.row) tabArray.insert(sourceTab, at: destinationIndexPath.row) try! realm.write { for (i, tab) in tabArray.enumerated() { print(tabArray) // tabArrayの中身が変わってしまう // tabArrayの中身が変わってしまい、tab.nameの値が変わってしまう tabObjects[i].name = tab.name // Realmのデータベースを更新 } } }
試したこと
tabObjects[i].name = tab.nameをコメントアウトすると、上記の現象は起こらず、tabArrayの中身は変わりません
tabArray自体には代入していないので、なぜ変わってしまうのか分かりません
補足情報(FW/ツールのバージョンなど)
最近、Swiftの勉強を始めたばかりなので、至らない点があると思いますが、どうぞよろしくお願いします
回答1件
あなたの回答
tips
プレビュー