【SwiftUI】@AppStorageの使い方を徹底解説

この記事では、@AppStorageの使い方について徹底解説していきたいと思います。

@AppStorageとは?

@AppStorageとは、UserDefaultasを@Stateのように扱えるカスタム属性です。UserDefaultsより非常にシンプルに書けます。

つまり、いちいちUserDefaults.standard.setとかUserDefaults.standard.integerとか書かなくてもUserDefaultsに保存・取得できるということです。

使い方

以下のアプリは簡単なカウンターアプリです。データを@AppStorageで管理しているので、アプリを終了させても値が保存されています。

以下のコードを貼り付けると、上記の動画と同じように動きます。

struct ContentView: View {
    @AppStorage("count_key") var counter = 0
    
    var body: some View {
        VStack {
            Text("Count: \(counter)")
                .padding()
            Button("カウント") {
                counter += 1
            }
            .buttonStyle(.borderedProminent)
        }
    }
}

@Stateのように値を変更すると再描画して値を更新します。@Stateと違うところが再実行しても値がリセットされずにちゃんと保存されています。この値はUserDefaultsに保存されています。ちなみにkeyはcount_keyです。

では、本当にUserDefaultsに保存されているか確認してみましょう。UserDefaultsをTextで表示させてみます。

struct ContentView: View {
    @AppStorage("count_key") var counter = 0
    
    var body: some View {
        VStack {
            Text("Count: \(counter)")
                .padding()
            Text("UserDefaultsの値:\(UserDefaults.standard.integer(forKey: "count_key"))")
                .padding()
            Button("カウント") {
                counter += 1
            }
            .buttonStyle(.borderedProminent)
        }
    }
}

動作確認すると同じようにカウントされているのがわかるかと思います。

@AppStorageを使わないで書くと以下のような感じになるかと思います。

struct ContentView: View {
    @State var counter = UserDefaults.standard.integer(forKey: "count_key")
    
    var body: some View {
        VStack {
            Text("Count: \(counter)")
                .padding()
            Button("カウント") {
                counter += 1
                UserDefaults.standard.set(counter, forKey: "count_key")
            }
            .buttonStyle(.borderedProminent)
        }
    }
}

@Stateを使っているのでそこまで変わらないっちゃ変わらないですが、ここから初期値を設定したり色々とすると@AppStorageの方がコード的にシンプルになっていくと思います。

まとめ

@AppStorageとは、UserDefaulstsを簡潔に@Stateのように使えるカスタム属性です。