【SwiftUI】UserDefaultsを@AppStorageから使おう

SwiftUI

Swiftでデータを永続化する際に気軽に使えて便利なUserDefaultsですが、
SwiftUIであれば@AppStorageを使う事で簡単に使用できます。

@AppStorageはUserDefaultsを監視するProperty Wrappersです。
ざっくり言うとUserDefaultsを参照する@Stateとか@Publishedみたいなやつです。

中身はUserDefaultsなので今までに保存した値も使えますし、
UserDefaults側のメソッドからも問題なく使用できるので気軽に使ってみましょう。

struct ContentView: View {
    
    @AppStorage("Text") var text = "Default Value"
    
    var body: some View {
        TextField("",text:self.$text)
            .padding()
    }
}

こんな感じで簡単に使えます。@AppStorageの後にKeyを指定するだけです。
Keyが無い場合は指定した値が入り、ある場合は保存されている値が入ります。

これのどこが便利かと言うと、コレだけで変更すると他のViewにも全て反映される点です。
KVOとか自分で書かなくてもiPadで他のWindowにも全部反映されるので非常に楽です。

あとは初期値が地味に便利ですね。
UserDefaultsはKeyが無い場合にはIntなら0、Boolならfalseが入るので、
必要に応じて別途、初期値の登録が必要だったんですよね。

struct ContentView: View {
    
//    @AppStorage("Text") var text = "Default Value"
    @AppStorage("Text" ,store:UserDefaults(suiteName: "AppGroupsId")) 
    var text = "Default Value"

    @AppStorage("Data") var data = Data()
    
    var body: some View {
        TextField("",text:self.$text)
            .padding()
    }
}

ちなみに、こんな感じでも使えるので、
App Groupesを使っている場合などでも保存場所を指定出来ます。
また対応されている型は少ないものの、
Data型が使えるので保存する分には変換できれば何でも使えます。

struct ContentView: View {
    
    let testClass = TestClass()
    
    var body: some View {
        TextField("",text:self.testClass.$text)
            .padding()
    }
}

class TestClass{
    @AppStorage("Text") var text = "Default Value"
}

当然ではありますがclassの中にも書けます。念の為。

コメント

  1. […] […]

タイトルとURLをコピーしました