サ活の編集後のデータがサ活リストに反映されない
po-miyasaka opened this issue · comments
再現動画
https://jewel-open-d5e.notion.site/mp4-edc3a8a151b24fb08e7da08b9ce2ea05
再現環境
- PC
- 2.3 GHz 8-Core Intel Core i9
- macOS
- Sonoma Version 14.0 (23A339)
- Xcode
- Version 15 (15A240d)
- ターゲット
- シミュレータ
(iPhone 15 Pro, iOS17.0)
でビルドインストール - 実機
(iPhone 11 pro, iOS17.0 (public beta)
でビルドインストール
- シミュレータ
再現しない環境
- 実機
(iPhone 11 pro, iOS16.6.1
でAppStoreから1.6.0(15)
をインストール - 実機
(iPhone 11 pro, iOS17.0 (public beta)
でAppStoreから1.6.0(15)
をインストール
デバッグ状況
- 編集後にSakatsuListView.bodyにて最新の情報は渡ってきているが、ForEachで情報がうまく反映されていない。
- 再現性100%というわけではなく、たまに再現する。
- 操作を続けていると以下のようなエラーがでてクラッシュ
Fatal error: Duplicate keys of type 'Sakatsu' were found in a Dictionary.
This usually means either that the type violates Hashable's requirements, or
that members of such a dictionary were mutated after insertion.
その他
- きれいな設計、コードでとても勉強になります!!
一応ワークアラウンドとして以下のように修正すると再現しないことを確認しました。
まだ原因の本質は掴めていないのでワークアラウンドという言い回しになっています。。
SakatsuRowView
にEquatableを準拠させることで、データが変更されたときにBodyを実行するかどうかの判定ができるのですが、それを明示した形です。
おお…とてもていねいなバグレポート、ありがとうございますー!
私も試したところ再現しました、、
#185 でデグレした可能性がありそうです、、うぅ…SwiftUI ムズかしい、、、
Fatal error: Duplicate keys of type 'Sakatsu' were found in a Dictionary.
This usually means either that the type violates Hashable's requirements, or that members of such a dictionary were mutated after insertion.
(致命的なエラー: Dictionaryに'Sakatsu'型の重複したキーが見つかりました。
これは通常、型がHashableの要件に違反しているか、そのような辞書のメンバが挿入後に変異していることを意味します。このようなディクショナリのメンバが挿入後に変更されたことを意味します。)
@po-miyasaka #194 これで直った気がします!
ご確認いただけると嬉しいです…!
(そもそもForEachのidはHashableだし、hashValueにはEquatableの比較の値は関係ないしで盛大な勘違いが解消されました😂)
@po-miyasaka ご確認ありがとうございますー! マージしました 👍
そうですね… ForEach
の id
は Hashable
なので、 Equatable
は関係ないと思います…!
モデル自体を Hashable
に準拠させてしまっていて、それを ForEach
の id
に使っていたので、モデルで id
以外の値が変わってもハッシュ値が変わってしまったのだと思われます…。
てことでモデルを Hashable
に準拠するのもやめました 2049aee