SwiftUI 常用 Property Wrappers 之 AppStorage

🧠🔋

有些时候我们需要存储一些数据在应用本地,比如一个新用户是否展示新手引导,当用户点击之后下次就不在展示,这个信息我们存在应用本地,当用户删除应用之后这个值也会被相应的删除。本地存储的这些信息是存放在UserDefaults 里,在 SwiftUI 里有个单独的 Property Wrapper 就是 AppStorage。

init(_ key: String, store: UserDefaults? = nil) where Value == Bool?
init(_ key: String, store: UserDefaults? = nil) where Value == Int?
init(_ key: String, store: UserDefaults? = nil) where Value == Double?
init(_ key: String, store: UserDefaults? = nil) where Value == String?
init(_ key: String, store: UserDefaults? = nil) where Value == URL?
init(_ key: String, store: UserDefaults? = nil) where Value == Data?

上面的初始化里就是可以存放的值的类型。

struct AppStorageView: View {
    @AppStorage("number") var number: Int = 0
    var body: some View {
        Button("Number: \(number)") {
            number += 1
        }
    }
}

可以看到上面我们定义 AppStorage 的时候,括号里的参数"number"就是存储的 UserDefauts 的key。

更新View

同样 AppStorage 值在变化的时候,也会更新到相应的使用到的页面。而且number其实是存在plist文件里,放在了磁盘中,下次启动后,让后会读取上次存储的内容。

struct AppStorageView: View {
    @AppStorage("number") var number: Int = 0
    @State var show = false
    var body: some View {
        Button("Number: \(number)") {
            show.toggle()
        }.sheet(isPresented: $show) {
            AppStorageSecondView()
        }
    }
}

struct AppStorageSecondView: View {
    @AppStorage("number") var number: Int = 0
    var body: some View {
        Button("Number: \(number)") {
            number += 1
        }
    }
}