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