uhooi / Loki

サ活記録アプリ for iOS

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

サ活の編集後のデータがサ活リストに反映されない

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.

その他

  • きれいな設計、コードでとても勉強になります!!

一応ワークアラウンドとして以下のように修正すると再現しないことを確認しました。
まだ原因の本質は掴めていないのでワークアラウンドという言い回しになっています。。

https://github.com/uhooi/Loki/compare/main...po-miyasaka:Loki:feature/work-around-not-reflecting-edit?expand=1

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 これで直った気がします!
ご確認いただけると嬉しいです…!

@uhooi
実機&シミュレータ共に問題ありませんでした!

SakatsuEquatableではidしか見てないので結局elementでもidでも同じなのかと思ってましたが違うんですねぇ
勉強になります!

(そもそもForEachのidはHashableだし、hashValueにはEquatableの比較の値は関係ないしで盛大な勘違いが解消されました😂)

@po-miyasaka ご確認ありがとうございますー! マージしました 👍
そうですね… ForEachidHashable なので、 Equatable は関係ないと思います…!
モデル自体を Hashable に準拠させてしまっていて、それを ForEachid に使っていたので、モデルで id 以外の値が変わってもハッシュ値が変わってしまったのだと思われます…。
てことでモデルを Hashable に準拠するのもやめました 2049aee