@AppStorage 和 UserDefaults 都是 Swift 中用于持久化存储用户数据的方法,但它们有一些不同的使用场景和便捷性。
UserDefaults
UserDefaults 是一种非常通用的存储方式,可以用于任何 Swift 代码中。它适用于存储轻量级的用户偏好设置和简单数据。通常用于 UIKit 和非 SwiftUI 的项目中。
import Foundation
// 存储数据
let defaults = UserDefaults.standard
defaults.set("Hello, UserDefaults", forKey: "myKey")
// 读取数据
if let savedString = defaults.string(forKey: "myKey") {
print(savedString) // 输出:Hello, UserDefaults
}
@AppStorage
@AppStorage 是 SwiftUI 的属性包装器,用于将值存储在 UserDefaults 中,并且可以自动更新 SwiftUI 的视图。它简化了在 SwiftUI 中使用 UserDefaults 的流程,能够使代码更加简洁和直观。
import SwiftUI
struct ContentView: View {
@AppStorage("myKey") var myStoredValue: String = "Default Value"
var body: some View {
VStack {
Text(myStoredValue) // 输出存储的值
Button("Change Value") {
myStoredValue = "Hello, AppStorage" // 修改存储的值
}
}
}
}
区别总结
-
使用场景:
UserDefaults:适用于所有 Swift 代码,尤其是 UIKit 和非 SwiftUI 的项目。@AppStorage:专为 SwiftUI 设计,简化了在 SwiftUI 中使用UserDefaults的流程。
-
代码简洁性:
UserDefaults:需要手动存取和更新数据。@AppStorage:使用属性包装器,可以自动绑定到 SwiftUI 的视图,简化了代码。
-
数据绑定:
UserDefaults:需要手动通知视图更新。@AppStorage:自动更新绑定的视图,符合 SwiftUI 的声明式编程风格。
示例对比
使用 UserDefaults:
import SwiftUI
struct ContentView: View {
@State private var myStoredValue: String = UserDefaults.standard.string(forKey: "myKey") ?? "Default Value"
var body: some View {
VStack {
Text(myStoredValue)
Button("Change Value") {
myStoredValue = "Hello, UserDefaults"
UserDefaults.standard.set(myStoredValue, forKey: "myKey")
}
}
}
}
使用 @AppStorage:
import SwiftUI
struct ContentView: View {
@AppStorage("myKey") var myStoredValue: String = "Default Value"
var body: some View {
VStack {
Text(myStoredValue)
Button("Change Value") {
myStoredValue = "Hello, AppStorage"
}
}
}
}
使用 @AppStorage 的代码明显更简洁,并且更符合 SwiftUI 的设计理念。这种方式自动处理了数据的存储和视图的更新,减少了手动操作的复杂性。