在Swift中,AppStorage是SwiftUI中引入的一个属性包装器,在这之前我们要存储一些轻量级的数据采用UserDefaults进行存取。而AppStorage用于从UserDefaults中读取值,当值改变时,它会自动重新调用视图的body属性。也就是说,这个AppStorage包装器有效地监视UserDefaults中的键值,并在键值更改时刷新UI。
下面先看一个在SwiftUI中使用UserDefaults存储的示例:

App第一运行时,没有显示userName,当点击SAVE后,userName赋值,并通过UserDefaults存起来。
当App第二个运行,在onAppear方法中,读取UserDefaults存取的userName值,赋值给userName属性并在UI上显示。
struct AppStorageDemo: View {
@State var userName: String?
var body: some View {
VStack(spacing: 30) {
if let userName {
Text(userName)
.font(.title)
}
Button(action: {
userName = "Daniel"
UserDefaults.standard.setValue(userName, forKey: "userName")
}, label: {
Text("SAVE")
.foregroundColor(.white)
.padding()
.background(Color.red)
.clipShape(Capsule())
})
}
.onAppear {
userName = UserDefaults.standard.string(forKey: "userName")
}
}
}
下面采用AppStorage包装器替换掉UserDefaults的存储逻辑。

上面代码采用AppStorage包装器包装userName属性,并在括号内设置了要监听的key值,这表明userName变量的值要通过这个key在UserDefaults存储。
@AppStorage("userName") var userName: String?
给userName赋值,则将值直接存储到UserDefaults中。
读取userName的值,也是拿对应的key去UserDefaults取值。
上面修改后的代码在App运行起来后,显示出了userName的值,这说明AppStorage包装器在UserDefaults通过userName这个key读取到了对应的值。
在文章开头说的被AppStorage包装器包装的属性,在其改变的时候,UI会自动刷新,下面看一下下面的示例:

通过两个Button切换userName的值,UI也及时的刷新了,通过再次启动App,显示也是上一次存储的值。
以上就是AppStorage包装器的简单介绍与使用,如有不对的地方,还望大家批评指正。
最后,希望能够帮助到有需要的朋友,如果您觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。

















