在开发 ref="/tag/2031/" style="color:#2B406D;font-weight:bold;">SwiftUI 应用时,经常需要保存一些简单的用户设置或状态数据,比如用户是否开启夜间模式、上次打开的页面、输入的用户名等。这时候,UserDefaults 就派上用场了。它不是用来存大量数据的,但对轻量级的数据持久化来说,简单又高效。
UserDefaults 是什么?
UserDefaults 是 iOS 提供的一个轻量级本地存储方案,适合保存布尔值、字符串、数字、数组、字典这类小数据。它基于键值对(Key-Value)方式存储,应用重启后数据依然存在。
在 SwiftUI 中如何使用?
假设你正在做一个待办事项 App,想记住用户是否开启了“完成任务时震动”的开关。你可以用 @AppStorage 这个属性包装器,它和 UserDefaults 深度集成,写起来特别顺手。
<struct SettingsView: View {>
<@AppStorage("vibrationEnabled") var vibrationEnabled = true>
<var body: some View {>
<Toggle("完成时震动", isOn: $vibrationEnabled)>
<.padding()>
<}>
<}>
这段代码里,@AppStorage 自动从 UserDefaults 读取 key 为 vibrationEnabled 的值,如果没存过就用默认值 true。每次切换开关,值会自动保存,不需要手动调用 set 或 synchronize。
直接操作 UserDefaults 的场景
有些时候你可能不用 @AppStorage,比如要在非 View 的地方存数据,像在一个工具类或网络请求回调里。这时可以直接调用 UserDefaults.standard。
<// 保存用户名>
<UserDefaults.standard.set("小明", forKey: "username")>
<// 读取用户名>
<if let name = UserDefaults.standard.string(forKey: "username") {>
<print("欢迎回来,\(name)")>
<}>
注意:key 名一定要拼写正确,建议定义成常量,避免写错。
实际开发中的小提醒
别拿 UserDefaults 存密码、大量文本或复杂对象。真要存自定义类型,可以先用 JSONEncoder 转成 Data 再存,但数据一多还是推荐用 Core Data 或 FileManager。
<struct User: Codable {>
<let name: String>
<let age: Int>
<}>
<// 存用户信息>
<let user = User(name: "小红", age: 25)>
<if let data = try? JSONEncoder().encode(user) {>
<UserDefaults.standard.set(data, forKey: "currentUser")>
<}>
<// 读取>
<if let data = UserDefaults.standard.data(forKey: "currentUser"),>
<let user = try? JSONDecoder().decode(User.self, from: data) {>
<print(user.name)>
<}>
这种做法可行,但只适合偶尔变、体积小的数据。要是用户频繁修改,还得考虑性能和崩溃风险。
UserDefaults 在 SwiftUI 里的使用,核心就是两个字:简单。只要把握好它的定位——存点小配置、小状态,不滥用,它就能默默帮你省不少事。