Swiftuiでは属性で@AppStorageというものがある。
従来モバイルデバイスにデータを保存する方法としてUserDefaultというものがあったが、
@AppStorageを用いることでより簡単にデバイスにデータを保存することが可能になった。
その属性の1つである@AppStorageについてまとめようと思います!
@AppStorageとはデータを保存するもの
AppStorageでは、バックグラウンドがUserDefaultになっていて、
AppStorageを使っても、結局はUserDefaultに保存されているということになります。
UserDefaultに保存すると永続性があるので、当然AppStorageに保存しても永続性があるわけで、
AppStorageに保存したデータはアプリが終了しても永続的にモバイルデバイスにデータを保存しているため、
再度アプリを起動すると、保存している値を取ってくることができる。
逆にアプリをアンインストールすると、そのアプリでAppStorageに保存したデータは削除される。
import SwiftUI @main struct AppMain: App { @UIApplicationDelegateAdaptor (AppDelegate.self) var appDelegate class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { return true } } var body: some Scene { WindowGroup { ContentView() } } } struct ContentView: View { @AppStorage("name") private var name:String = "first" var body: some View { Text("\(self.name)") Form(){ TextField("氏名を入力してください", text: $name) } } }
ビルドして最初にFirstとは入っています。
そしてSecondと入力し、ビルドを停止し再度ビルドをかけてアプリを起動させます。
そうすると、Secondになっているのが確認できます。
ビルドしたアプリを削除し、再度ビルドするとFirstになります。
SceneStorage
SceneStorageでは、AppStorageと書き方は同じですが、
Sceneという考えが大事になってきます。
デバイスを再起動した場合でも,
@SceneStorageでデータを保存していれば、システムはデータを復元してくれる。
データはシーンごとに保存され、それぞれのシーンでデータは共有されないし、データ保存はシステムが管理していて、いつどのくらいの頻度でデータを保存するかはわからない。
まずそもそもScene(シーン)とは
https://crystalminds.medium.com/introducing-scenestorage-in-swiftui-5a4ec1a90ca3
さて、使用する前に@SceneStorage、Appleからいくつかの重要な警告があります。
- 大量のデータを保存しないでください。状態の復元に必要なものだけを保存します。
- 安全ではないため、機密データをシーンストレージに保存しないでください。
- ユーザーがアプリスイッチャーにアクセスしてアプリを破棄すると、シーンストレージも破棄されます。
https://www.hackingwithswift.com/quick-start/swiftui/what-is-the-scenestorage-property-wrapper