LoginSignup
2
2

More than 1 year has passed since last update.

SwiftUIのAppStorage、UserDefaultsについて

Last updated at Posted at 2023-02-16

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で表示する際に、保存されていない値を表示したり、保存している値を表示させたいケースもあるでしょう。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2