【SwiftUI】@AppStorageとは?UserDefaultsとの違い

@AppStorageとは?UserDefaultsとの違い

実行環境

Swift5.6.1
Xcode14.0

@AppStorageとは?

@AppStorage = UserDefaults + @State

@AppStorageは、
UserDefaultsと@Stateの性質を持ち合わせ、少ないコード量で記述できる便利なもの。
だと私は認識しています。

公式ドキュメントは下記のような感じ。

A property wrapper type that reflects a value from UserDefaults and invalidates a view on a change in value in that user default.

@AppStorage公式ドキュメント(Apple)

DeepLの力を借りて日本語訳すると、
「UserDefaultsの値を反映し、そのユーザーデフォルトの値の変更に伴いビューを無効化するプロパティラッパータイプ」

このことから、
アプリ内にデータを保存するUserDefaultsと、
プロパティの値とUIの状態を自動的に同期する@Stateの性質をあわせ持つカスタム属性と言えると思います。

UserDefaultsは宣言にコード量がそこそこ必要だったのに対して、
たった1行で宣言・変更ができます。

参考:UserDefaults公式ドキュメント(Apple)

扱える型

下の型が利用できました。Floatは利用できませんでした。
整数(Int)
浮動小数点数(Double)
文字列(String)
真偽値(Bool)
バイナリ(Data)

もし期待していた型が存在しない場合、
Data型にエンコード・デコードすることで利用できるかもしれません。

SwiftyUserDefaultsのライブラリを利用するのも一つの手かもしれません。

記述方法

下のように記述することで、
“UserName”というキー名でUserDefaultsに保存されています。

@AppStorage("UserName") var textByAppStorage = ""

取り出しは、指定した変数名をそのまま記述します。
データはUserDefaultsに保存されているので、以下どちらのコードでも値を取り出せます。

Text(textByAppStorage)
Text(UserDefaults.standard.string(forKey: "UserName") ?? "" )

実装

下のように、アプリを再起動させても値が永続化されるコードを実装します。

struct ContentView: View {
    @AppStorage("UserName") var textByAppStorage = ""

    var body: some View {
        VStack {

            TextField("名前を教えて下さい", text: $textByAppStorage)
                .padding()

            Text(textByAppStorage)
                .padding()

        }
        .padding()
    }
}

まとめ

ということで、本記事は@AppStorageに関して、自分のメモ程度にまとめました。
アドバイスや本記事の改善などあれば本記事の最後のコメント欄からお願いいたいます。
最後まで読んでいただきありがとうございました。

作業効率がグッと上がるPC道具

間違いなしのSwift書籍2冊



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です