UserDefaultsで複数の値をセットで保存する


UserDefaultsで複数の値をセットで保存する方法です。 辞書型配列を使う方法と保存用のstructを作成する方法でサンプルコードを作成しました。 Set ボタンを押すと UserDefaults にカビゴンの情報が保存され、Get ボタンを押すとカビゴンの情報をコンソールに出力します。

辞書型配列を使う方法

ContentView.swift

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Button {
                var snorlax: Dictionary<String, Any> = [:]
                snorlax["id"] = 143
                snorlax["name"] = "snorlax"
                snorlax["type"] = "normal"
                UserDefaults.standard.set(snorlax, forKey: "snorlax")
            } label: {
                Text("Set")
                    .font(.system(size: 28).bold())
                    .padding()
                    .border(.black)
                    .padding()
            }

            Button {
                if let snorlax = UserDefaults.standard.object(forKey: "snorlax") as? Dictionary<String, Any> {
                    print(snorlax["id"] as! Int)
                    print(snorlax["name"] as! String)
                    print(snorlax["type"] as! String)
                }
            } label: {
                Text("Get")
                    .font(.system(size: 28).bold())
                    .padding()
                    .border(.black)
                    .padding()
            }
        }
    }
}

保存用のstructを作成する方法

ContentView.swift

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Button {
                let snorlax: Pokemon = Pokemon(id: 143, name: "snorlax", type: "normal")
                let encoded: Data = try! JSONEncoder().encode(snorlax)
                UserDefaults.standard.set(encoded, forKey: "snorlax")
            } label: {
                Text("Set")
                    .font(.system(size: 28).bold())
                    .padding()
                    .border(.black)
                    .padding()
            }

            Button {
                if let encoded = UserDefaults.standard.object(forKey: "snorlax") as? Data,
                   let snorlax = try? JSONDecoder().decode(Pokemon.self, from: encoded) {
                   print(snorlax)
                }
            } label: {
                Text("Get")
                    .font(.system(size: 28).bold())
                    .padding()
                    .border(.black)
                    .padding()
            }
        }
    }
}

Pokemon.swift

import Foundation

struct Pokemon: Codable {
    let id: Int
    let name: String
    let type: String
}