从 Xcode 12.0 (iOS 14.0) 开始,您可以使用 @AppStorage
属性包装器来存储以下类型的数据: Bool、Int、Double、String、URL
和Data
。以下是用于存储字符串值的示例:
struct ContentView: View {
static let userNameKey = "user_name"
@AppStorage(Self.userNameKey) var userName: String = "Unnamed"
var body: some View {
VStack {
Text(userName)
Button("Change automatically ") {
userName = "Ivor"
}
Button("Change manually") {
UserDefaults.standard.setValue("John", forKey: Self.userNameKey)
}
}
}
}
在这里,您正在声明具有默认值的userName
属性,该值并未进入UserDefaults
本身。当您首次对其进行更改时,应用程序将该值写入UserDefaults
并自动使用新值更新视图。
此外,如果需要,还可以通过store
参数设置自定义UserDefaults
提供程序,例如:
@AppStorage(Self.userNameKey, store: UserDefaults.shared) var userName: String = "Mike"
和
extension UserDefaults {
static var shared: UserDefaults {
let combined = UserDefaults.standard
combined.addSuite(named: "group.myapp.app")
return combined
}
}
注意:如果该值在应用程序之外更改(比如手动打开plist文件并更改值),则View将不会接收到更新。
P.S. 还有一个新的View
扩展,它添加了func defaultAppStorage(_ store: UserDefaults) -> some View
,可以用于更改View使用的存储方式。如果有很多@AppStorage
属性并且为每个属性设置自定义存储方式很麻烦,这将非常有帮助。
@EnvironmentObject
吗?它似乎是替代某些UIKit
组件的一部分。另一个区别是与场景相关还是与应用程序相关(例如,SceneDelegate 与 AppDelegate)。至于“...UserDefaults in general...”?也许你需要一次只问一个问题?先学习UIKit
和UserDefaults
,然后再学习如何将其应用到SwiftUI
中。 - user7014451