1.UserDefaultsについて
Apple公式のUserDefaultsについては、以下のように記載されています。
An interface to the user’s defaults database, where you store key-value pairs persistently across launches of your app.
つまり翻訳すると、UserDefaultsはキーと値のペアを永続的に保存することができるインターフェースなのですという意味になります。
UserDefaultsを利用することによって、簡単にデータを保存、参照したりできます。
永続的にデータを保存すると言っても、アプリを削除した場合データは削除されます。
2.データの保存方法について
どんなオブジェクトでも保存可能です。
UserDefaults.standard.set(value: Any?, forKey: String)
使用したことはないですが、二次元配列も保存可能です。
let list: [[String]] = [["Microsoft","Windows","Hololens2","Unity"],["Apple","iOS","iPhoneXS","Swift"]]
UserDefaults.standard.set(list, forKey: "infoList")
こちらの記事を参考にしました
https://ios-docs.dev/userdefaults/
3.synchronize()は非推奨
以前までは、永続的に保存するために、以下のコードが必要であった。
UserDefaults.standard.synchronize()
しかし、Apple公式によると非推奨であると以下のように明言されている。
Waits for any pending asynchronous updates to the defaults database and returns; this method is unnecessary and shouldn't be used.
4.データの参照方法について
UserDefaults.standard 以降を型によって変えて取得する。
UserDefaults.standard.string(forKey: String)
UserDefaults.standard.bool(forKey: String)
UserDefaults.standard.integer(forKey: String)
guard letや if letを使い安全に取得すると良い。
以下の例は、保存方法で扱った二次元配列の続きです。
//if letの場合
if let infoList = UserDefaults.standard.array(forKey: "infoList") as! [String] {
//何かしらの処理
}
//guard letの場合
guard let infoList = UserDefaults.standard.array(forKey: "infoList") as! [String] else { return }
本題 SwiftUIで@AppStorageを使う
SwiftUIでは、@AppStorageの変数を定義することによって、UserDefaults.standardの構文を使わずにシンプルにデータを保存または参照することが可能になります。
以下のように実にシンプルであり、覚えていて損はないと思います。
@AppStorage("キー") var 変数名 = ""
以下は実装例です。
もしどこかの場面でcityの変数に対して、値を代入していれば、それが永続的に保存されていて、参照され、表示されます。
struct HomeView: View {
@AppStorage("city") var city = ""
var body: some View {
VStack {
Text(city)
}
}
}
UserDefaults.standardを全く使わないのか?と言われれば、UserDefaults.standardを使う場面もあると思います。
実際にはViewで表示する際に、保存されていない値を表示したり、保存している値を表示させたいケースもあるでしょう。