はじめに
この記事ではUserDefaultsに自作のstruct、structの配列を保存する方法をしまします。この方法のほかにもっと良い方法があれば教えてください。よろしくお願いします。
概要
自作のstructのインスタンスをencodeしてData型に変換することでUserDefaultsに保存します。
UserDefaultsからデータを取得する際はdecodeすることでもとに戻し、使えるようにします。
前半では自作のstructを保存、取得する方法を紹介します。
後半では自作のstructを配列にして保存する方法を紹介します。
structを作る
まずは任意のstructを作成します。
今回は以下のように作成しました。
自作のstrucrにはCodableを準拠させます。
struct Pirate: Codable {
let name: String
let age: Int
let siblings: [String]?
}
インスタンス化
今回は以下のようにインスタンスを作成しました。
let rufy = Pirate(name: "ルフィ", age: 19, siblings: ["エース","サボ"])
encode
UserDefaultsに保存するためにData型に変換します。
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
guard let crew = try? encoder.encode(mugiwaraFamily) else { return }
保存
UserDefaultsに保存します。
forkeyはString型で自分の好きなkeyを設定してください。
保存したデータを取得するときにkeyを使います。
これで保存は完了です。
UserDefaults.standard.set(crew, forKey: key)
取得
decodeしてData型から変換します。
forkeyは保存したときに設定したkeyを指定します。
これで、定数「rufy」の中に保存していた値を取得することができます。
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
guard let data = UserDefaults.standard.data(forKey: key),
let rufy = try? decoder.decode(Pirate.self, from: data) else { return }
自作structの配列を保存する
以下のように配列を作成します。保存の方法は同じなので省略します。
let mugiwaraFamily: [Pirate] = [
Pirate(name: "ルフィ", age: 19, siblings: ["エース","サボ"]),
Pirate(name: "ゾロ", age: 21, siblings: nil ),
Pirate(name: "ナミ", age: 20, siblings: ["ノジコ"]),
Pirate(name: "ウソップ", age: 19, siblings: nil ),
Pirate(name: "サンジ", age: 21, siblings: ["イチジ","ニジ","ヨンジ","レイジュ"])
]
取得
取得方法もほとんど変わらないのですが、4行目を[Pirete]とすることで、自作structの配列を取得できます。
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
guard let data = UserDefaults.standard.data(forKey: key),
let crew = try? decoder.decode([Pirate].self, from: data) else { return }
おわりに
いかがだったでしょうか?何か間違っているところや、もっと良い方法があればご指導ください。よろしくお願いします。
参考リンク
↧