【やりたいこと】複数画面に渡って共通の配列の値を参照・更新をかけることができるように、UserDefaultsへ、配列の値を格納し、取得するコードを組みたいです。また、配列は自分で定義した構造体の型で定義しています。
下記の方法で実現を試してみましたが、(3)がうまく行きません。(下記詳細)
【処理概要】
(1)構造体:foodの定義
(2)food型の配列に値を入れ、UserDefaultsへ格納する
(3)UserDefaultsから、(2)で登録した値を取得する
※本来、こういったリストのデータを格納するには、UserDefaultsよりもCoreDataを使う方が良いという理解をしていますが、今回は練習でUserDefaultsを使っています。
【コード】
(1)構造体foodの定義
Swift
1struct food :Codable{ 2 var nameJP : String 3 var buyDate : String 4 var volume : Int 5 var imageName : String 6} 7
(2)food型の配列に値を入れ、UserDefaultsへ格納する
Swift
1 2import UIKit 3 4class Cabin:UIViewController, UITableViewDelegate, UITableViewDataSource{ 5 6 //UseDefaultsに入れたい配列 7 var InputFoodlist:[food]=[ 8 food(nameJP: "牛乳", buyDate:"20200101", volume: 1, imageName: "milk"), 9 food(nameJP: "卵", buyDate: "20200106", volume: 5, imageName: "egg"), 10 food(nameJP: "豚肉", buyDate: "20210301", volume: 2, imageName: "meat(pig)") 11 ] 12 //UserDefaultsから取得した値を格納するFoodList 13 var Foodlist:[food] = [] 14 15 let userDefaults = UserDefaults.standard 16 17 override func viewDidLoad() { 18 19 super.viewDidLoad() 20 //UserDefaultに、値を入れる 21 Inputlist() 22 //UserDefaultから値を取得数 23 getFoodlist() 24 } 25 26 //UserDefaultsへ値を格納するメソッド 27 func Inputlist(){ 28 let encoder = JSONEncoder() 29 if let encodedValue = try? encoder.encode(InputFoodlist){ 30 UserDefaults.standard.set(encodedValue, forKey: "default") 31 } 32 } 33
(3)UserDefaultsから、(2)で登録した値を取得する
Swift
1 func getFoodlist(){ 2 /// 読み込み 3 if let savedValue = UserDefaults.standard.data(forKey: "default") { 4 let decoder = JSONDecoder() 5 if let value = try? decoder.decode(food.self, from: savedValue) { 6 //ぶち込んだFoodlistの値が取れて欲しい 7 print("UserDefaultsを取得") 8 print(value) 9 } 10 else { 11 print("値取れてない") 12 } 13 } 14 } 15
発生している問題・エラーメッセージ
上記処理を実行するとgetFoodlistメソッドのelseの方の処理が実行され、、"値取れていない"と出力される(=正しくUserDefaultsから値が取れていない)状態となってしまします。 初心者なりの見当違いかもしれないのですが、恐らくUserDefaultsからdecodeして取得する値と、 それを受け取る箱の型が一致していないことが原因なのかと考えているのですが、 仮にそうであった場合、どのように修正したら良いかがネットの記事等を見てもわからなかったです。 原因と、対処案をご教示いただけますと大変助かります。 また、【やりたいこと】に対して、より良い実現方法等あればオプションとして教えていただけると大変大変助かります。 よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/17 14:15