Codable + UserDefaults で保存する。
正しい保存
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
struct CCC: Codable { var aaa: String var bbb: BBB } struct BBB: Codable { var ccc: String } class TestClass { var c: CCC? func ee() { c = CCC(aaa: "123", bbb: BBB(ccc: "456")) if let data = try? JSONEncoder().encode(c) { UserDefaults.standard.set(data, forKey: "test") print("保存成功") } } func ff() { do { guard let a = UserDefaults.standard.data(forKey: "test") else { throw NSError(domain: "", code: 0, userInfo: nil) } c = try JSONDecoder().decode(CCC.self, from: a) print("読み込み成功") } catch { print("読み込み失敗") } } } |
失敗例(構造体の初期化がNG)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
struct CCC: Codable { var aaa: String var bbb: BBB } struct BBB: Codable { var ccc: String } class TestClass { var c: CCC? func ee() { c?.aaa = "123" c?.bbb.ccc = "456" if let data = try? JSONEncoder().encode(c) { UserDefaults.standard.set(data, forKey: "test") print("保存成功") } } func ff() { do { guard let a = UserDefaults.standard.data(forKey: "test") else { throw NSError(domain: "", code: 0, userInfo: nil) } c = try JSONDecoder().decode(CCC.self, from: a) print("読み込み成功") } catch { print("読み込み失敗") } } } |
その他失敗する原因
- まだ保存(encode+
set)していない - 保存時と読み出し時でキーが違う
- 保存に失敗している
- UserDefaults の同期タイミングの問題
- 異なる UserDefaults を参照している
- 初期起動などで登録されていない
コメント