構造体をUserDefaultに保存する

以下の構造体をUserDefaultに保存したい時

struct Yasai: Codable {
    let name: String
    let price: Int
}

保存

UserDefaults.standard.set(try? PropertyListEncoder().encode([ninjin]), forKey:"yasai")
UserDefaults.standard.synchronize()

取得

if let data = UserDefaults.standard.value(forKey:"yasai") as? Data {
    let yasai = try? PropertyListDecoder().decode(Array<Yasai>.self, from: data)
    print(yasai?.first)
} else {
    print("失敗")
}

どうなってんの?

UserDefaultに保存する時PropertyListDecoderに構造体を渡してエンコードしています。

PropertyListDecoderによってYasaiの構造体がデータ型に変換されてます。

エンコードの例でわかりやすい画像があったのでNVRブログさんからお借りしてきました

https://nvr.bz/topics/knowledge/what-encode.php

実際に値を使用する際にデコードをして元の形に戻して構造体を取得しています。

そして忘れてはいけないのが、Yasai構造体がエンコード、デコードできるのはCodableプロパティに準拠しているから!

typealias Codable = Decodable & Encodable

Codableは何者なのか定義元を確認してみるとDecodable & Encodableそのまんまでした!エンコードとデコードをしたい時はCodable🤖

参考文献

構造体をUserDefaultsに保存

PropertyListEncoder