【SwiftUI】@AppStorageでデータを永続化(端末保存)する

SwiftUI でデータを保存するには、これまで通り UserDefaults が使えますが、SwiftUI では @AppStorage というキーワードを付加した変数でこれと同じことが行えます。

@AppStorage 変数はデータ保存だけでなく、@State 変数と同じように View に対して更新を即座に反映することができます

早速、使用例を紹介します。

@AppStorageでデータを永続化(端末保存)する

ボタンをタップして整数をカウントする例です。

struct ContentView: View {
    
    @AppStorage("IntegerKey") var counter = 0
    
    var body: some View {
        Text("Count: \(counter)")
        Button("タップしてインクリメント") {
            counter += 1
        }
    }
}

再度起動し直して、カウント後の値で再開していることが確認できるはずです。

配列や辞書型、独自データ形式の保存には対応していない

2021/01時点での SwiftUI バージョンで保存できるのは以下のデータのみです。

  • 整数(Int
  • 浮動小数点数(Double※Floatは不可
  • 文字列(String
  • 真偽値(Bool
  • バイナリ(Data

@AppStorage の実体は UserDefaults

@AppStorage 変数の値は、実は UserDefaults に保存されています

先ほどの使用例のカウンタを UserDefaults から表示してみると同じ値が確認できるはずです。

struct ContentView: View {
    
    @AppStorage("IntegerKey") var counter = 0
    
    var body: some View {
        Text("UserDefaultから確認: \(UserDefaults.standard.integer(forKey: "IntegerKey"))")
        Button("タップしてインクリメント") {
            counter += 1
        }        
    }
}

UserDefaults の値はViewに更新を伝えられないので、この状態でボタンをタップしても表示は変わりませんが、再度起動し直すとデータが更新されていることが確認できるはずです。

以上