(2020/11/8 更新)
SwiftUIでUserDefaultsを使う方法を解説します。
環境
この記事の情報は次のバージョンで動作確認しています。
【Xcode】12.1
【Swift】5.3
【iOS】14.1
【macOS】Catalina バージョン 10.15.7
【Swift】5.3
【iOS】14.1
【macOS】Catalina バージョン 10.15.7
カスタムクラスの作成
SwiftUIではデータを保持するカスタムクラスを用意して、UserDefaultsへのアクセス処理を全てまとめてしまうのがスマートです。
以下はユーザー名(username)とレベル(level)を保持するカスタムクラスの例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class UserProfile: ObservableObject { /// ユーザ名 @Published var username: String { didSet { UserDefaults.standard.set(username, forKey: "username") } } /// レベル @Published var level: Int { didSet { UserDefaults.standard.set(level, forKey: "level") } } /// 初期化処理 init() { username = UserDefaults.standard.string(forKey: "username") ?? "" level = UserDefaults.standard.object(forKey: "level") as? Int ?? 1 } } |
SwiftUIの監視対象とする為、ObservableObjectプロトコルに準拠したクラスとし、各プロパティには@Published属性を付加しています。
UserDefaultへのアクセス処理は、次の2点です。
- 初期化処理(init)で初期値の読み込み。
- didSetで各プロパティの値が更新されたタイミングで保存。
使用例
作成したカスタムクラス(UserProfile)を使用した例です。
Viewとデータの同期を取るため、 @ObservedObject属性を付加して、インスタンスを宣言します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
struct ContentView: View { @ObservedObject var profile = UserProfile() var body: some View { NavigationView { Form { Section(header: Text("PROFILE")) { TextField("ユーザー名", text: $profile.username) Stepper(value: $profile.level, in: 1...10) { Text("Level : \(profile.level)") } } } .navigationTitle("設定") } } } |
あわせて読みたい記事
【Swift】UserDefaultsの使い方
アプリ内にデータを保存するUserDefaultsの使い方を解説します。
【SwiftUI】@ObservedObjectの使い方
(2020/11/28 更新) SwiftUIのデータバインディングの仕組みの一つで、データクラスの更新を監視する@ObservedObjectの使い方を解説します。 これを利用すると複数のViewから同一インスタンスへの同期が可能になりま...