前提・実現したいこと
UserDefaultsを使用して値をやり取りするアプリを作成しています。
カスタムクラスをUserDefaultsで取り扱うために、Codableを使って値をUserDefaultsに読み書きしようと試みています。
発生している問題・エラーメッセージ
UserDefaultsに保存した値をdecodeすると、値がnilになってしまう
該当のソースコード(簡単の為にPlaygroundで動確しています)
Swift5
1//: A UIKit based Playground for presenting user interface 2 3import UIKit 4import PlaygroundSupport 5 6class List:Codable { 7 8 var text: String? 9 10 init(text: String) { 11 12 self.text = text 13 14 } 15} 16 17class MyViewController : UIViewController { 18 19 20 21 var listItems: [List] = [] 22 23 24 override func loadView() { 25 let view = UIView() 26 view.backgroundColor = .white 27 28 let label = UILabel() 29 label.frame = CGRect(x: 150, y: 200, width: 200, height: 20) 30 label.text = "Hello World!" 31 label.textColor = .black 32 33 view.addSubview(label) 34 self.view = view 35 36 //UserDefaultsにデータを保存 37 listItems.append(List(text: "test")) 38 let archivedData = try? JSONEncoder().encode(listItems) 39 UserDefaults.standard.set(archivedData, forKey: "List") 40 41 //UserDefaultsからデータを読み込み 42 let data = UserDefaults.standard.data(forKey: "List") 43 let unarchivedObject = try? JSONDecoder().decode(List.self, from: data!) 44 } 45} 46PlaygroundPage.current.liveView = MyViewController() 47
試したこと
let data = UserDefaults.standard.data(forKey: "List")
には値があるのですが、
let unarchivedObject = try? JSONDecoder().decode(List.self, from: data!)
でnilになっているようです。
恐らくキャストの仕方がイマイチなのかと思いますが、デバッグしきれずにおります。
お力添えいただけないでしょうか。
補足情報(FW/ツールのバージョンなど)
Swift5
Xcode11.5
try? をつかわずに do {} catch {} で例外を出力してみてください
ありがとうございます。
do{
try JSONDecoder().decode(List.self, from: data!);
} catch {
print("ERROR: \(error)")
}
で
ERROR: typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil))
という出力が得られました。
Listを配列として入力していないことが原因かなと思い
try JSONDecoder().decode([List].self, from: data!)
としたら狙いのデコードになりました。
ありがとうございました。
もう一個だけお願いなんですが、
きちんと現象を理解したいので、今回の問題点を解説していただけないでしょうか?(すいません)
回答1件
あなたの回答
tips
プレビュー