在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包装器的简单介绍与使用,如有不对的地方,还望大家批评指正。
最后,希望能够帮助到有需要的朋友,如果您觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。