【Swift】構造体をUserDefaultsで保存する

構造体の配列に色々なデータを詰め込んでまとめて保存する方法。

構造体にCodableを継承すれば1行でセーブとロードができて簡単だった。

データのモデル用にクラスを作成して、セーブデータがあればイニシャライザの中でデータの読み込み、無ければ空の配列を読むようにしています。

データをセーブするときには専用の関数を作って任意のタイミングでセーブします。

import Foundation

class TrainingData:ObservableObject{
    
    @Published var gym: [Gym]
    
    init() {
        
        if let data = UserDefaults.standard.value(forKey:"trainings") as? Data {
            self.gym = try! PropertyListDecoder().decode(Array<Gym>.self, from: data)
        }else{
            self.gym = []
        }
    }
    
    func saveData(){
        UserDefaults.standard.set(try? PropertyListEncoder().encode(self.gym), forKey:"trainings")
    }
}

struct Gym:Identifiable,Codable {
    var id: Int
    var Menu:String
    var Weight:Int
    var Kaisu:Int
    var Setsu:Int
    var Date:Date
    
    init(id:Int,Menu:String,Weight:Int,Kaisu:Int,Setsu:Int,Date:Date) {
        self.id = id
        self.Menu = Menu
        self.Weight = Weight
        self.Kaisu = Kaisu
        self.Setsu = Setsu
        self.Date = Date
    }
}

参考:

https://stackoverflow.com/questions/44876420/save-struct-to-userdefaults/45909055#45909055