@AppStorage 是 SwiftUI 提供的一个属性包装器,用于简化在应用中存储和读取用户默认设置(UserDefaults)的操作。通过 @AppStorage,你可以轻松地将应用的用户设置与视图的状态绑定在一起,使其自动化、简洁和响应式。
工作原理
@AppStorage 会将一个值存储在 UserDefaults 中,并确保这个值在视图更新时保持同步。你只需要提供一个键(Key)和一个默认值,SwiftUI 会自动帮你从 UserDefaults 中读取这个键对应的值,并将其更新到视图的状态中。
import SwiftUI
struct ContentView: View {
@AppStorage("username") private var username: String = "Guest"
var body: some View {
VStack {
Text("Hello, \(username)!")
Button("Change Username") {
username = "John Doe"
}
}
}
}
1、@AppStorage(“username”) private var username: String = “Guest”
@AppStorage 会将 username 变量绑定到 UserDefaults 中的一个键 “username”。
如果 “username” 这个键存在,username 的值会从 UserDefaults 中获取;
如果不存在,username 会使用默认值 “Guest”。
2、自动同步
当 username 改变时,SwiftUI 会自动更新 UserDefaults 中的值。
同时,视图会自动重新渲染,以反映新的值。
3、优势
简化了存储数据的操作。无需手动使用 UserDefaults.standard.set 或 UserDefaults.standard.string(forKey:) 等方法。
自动与视图状态同步。当值改变时,SwiftUI 会自动更新视图。
使用场景
持久化用户设置:例如主题选择、语言偏好、用户名、用户上次选择的选项等。
跨应用启动的状态保存:可以在应用关闭后保留某些设置,让用户体验更连贯。
对比手动操作 UserDefaults
传统上,使用 UserDefaults 的代码如下:
// 写入
UserDefaults.standard.set("John Doe", forKey: "username")
// 读取
let username = UserDefaults.standard.string(forKey: "username") ?? "Guest"
使用 @AppStorage 后,简化为:
@AppStorage("username") private var username: String = "Guest"
@AppStorage细节对比
@AppStorage("currentLanguage") private var currentLanguage: String = "en"
@AppStorage("currentLanguage") private var storedLanguage: String = "en"
这两个 @AppStorage 属性的区别主要在于它们的变量名和使用场景:
1、相同点
都绑定到 UserDefaults 中相同的键:”currentLanguage”。
都具有相同的默认值:”en”。
读取和存储数据时,操作的是同一个 UserDefaults 键。
2、区别
变量名不同
private var currentLanguage: String = "en"
private var storedLanguage: String = "en"
虽然它们都绑定到 UserDefaults 的同一个键 “currentLanguage”,但在 Swift 代码中,它们是两个不同的变量。
总结
@AppStorage 是 SwiftUI 的一个便捷工具,它能帮助你以响应式的方式将视图状态与 UserDefaults 中的数据关联起来,大大简化了保存和读取用户设置的代码。这样可以让应用在多个启动周期之间保持一致的用户体验。