構造体の保存

Codable + UserDefaults で保存する。

正しい保存

失敗例(構造体の初期化がNG)

その他失敗する原因

  1. まだ保存(encode+set)していない
    • data(forKey: dc_key) が nil になるのは、そもそもそのキーで Data が保存されていない可能性があります。
    • 保存処理(Codable を JSONEncoder().encode(...) → UserDefaults.standard.set(encoded, forKey: dc_key))が呼ばれていない、あるいは失敗している。
  2. 保存時と読み出し時でキーが違う
    • dc_key が読み込み時と保存時で差異がある(typo、異なる定義など)
    • 別の名前空間やプレフィックスを使っていないかを確認。
  3. 保存に失敗している
    • JSONEncoder().encode(...) が失敗(例:エンコードできないプロパティがある)
    • try? などでエラーを握りつぶしている → 実際は nil データが保存されていない
  4. UserDefaults の同期タイミングの問題
    • 非同期に保存 → 読み込み時にはまだデータがセットされていない
    • UserDefaults.standard.synchronize() は基本不要だが、タイミング依存バグが出ている可能性
  5. 異なる UserDefaults を参照している
    • 例えば App Groups 用の UserDefaults(suiteName:) を使っているが、読み出し側では standard を使っている
    • @EnvironmentObject var SET: SettingManager で使っているキー/UserDefaults が異なっている
  6. 初期起動などで登録されていない
    • register(defaults:) を使っているが、それだけだと data(forKey:) は返ってこない(登録ドメインの扱いに注意) Qiita
    • 初回は必ず set してからデコードを試すロジックが必要

コメント

タイトルとURLをコピーしました