質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1000閲覧

for文で代入していないのに配列の中身が変わってしまう

退会済みユーザー

退会済みユーザー

総合スコア0

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/02/17 14:39

編集2020/02/17 14:50

前提・実現したいこと

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の勉強を始めたばかりなので、至らない点があると思いますが、どうぞよろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/21 01:46

回答ありがとうございます。サンプルを参考に自分のしたいことを実現することができました。
guest

回答1

0

ベストアンサー

コメントに記載されていたurlを参考に実現することができました。
ありがとうございました。

投稿2020/02/26 20:31

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問