Swift存储属性包装器@AppStorage
Swift存储属性包装器@AppStorage

Swift存储属性包装器@AppStorage

@AppStorage 是 SwiftUI 提供的一个属性包装器,用于简化在应用中存储和读取用户默认设置(UserDefaults)的操作。通过 @AppStorage,你可以轻松地将应用的用户设置与视图的状态绑定在一起,使其自动化、简洁和响应式。

工作原理

@AppStorage 会将一个值存储在 UserDefaults 中,并确保这个值在视图更新时保持同步。你只需要提供一个键(Key)和一个默认值,SwiftUI 会自动帮你从 UserDefaults 中读取这个键对应的值,并将其更新到视图的状态中。

import SwiftUI

struct ContentView: View {
    @AppStorage("username") private var username: String = "Guest"
    
    var body: some View {
        VStack {
            Text("Hello, \(username)!")
            Button("Change Username") {
                username = "John Doe"
            }
        }
    }
}

1、@AppStorage(“username”) private var username: String = “Guest”

@AppStorage 会将 username 变量绑定到 UserDefaults 中的一个键 “username”。

如果 “username” 这个键存在,username 的值会从 UserDefaults 中获取;

如果不存在,username 会使用默认值 “Guest”。

2、自动同步

当 username 改变时,SwiftUI 会自动更新 UserDefaults 中的值。

同时,视图会自动重新渲染,以反映新的值。

3、优势

简化了存储数据的操作。无需手动使用 UserDefaults.standard.set 或 UserDefaults.standard.string(forKey:) 等方法。

自动与视图状态同步。当值改变时,SwiftUI 会自动更新视图。

使用场景

持久化用户设置:例如主题选择、语言偏好、用户名、用户上次选择的选项等。

跨应用启动的状态保存:可以在应用关闭后保留某些设置,让用户体验更连贯。

对比手动操作 UserDefaults

传统上,使用 UserDefaults 的代码如下:

// 写入
UserDefaults.standard.set("John Doe", forKey: "username")

// 读取
let username = UserDefaults.standard.string(forKey: "username") ?? "Guest"

使用 @AppStorage 后,简化为:

@AppStorage("username") private var username: String = "Guest"

@AppStorage细节对比

@AppStorage("currentLanguage") private var currentLanguage: String = "en"
@AppStorage("currentLanguage") private var storedLanguage: String = "en"

这两个 @AppStorage 属性的区别主要在于它们的变量名和使用场景:

1、相同点

都绑定到 UserDefaults 中相同的键:”currentLanguage”。

都具有相同的默认值:”en”。

读取和存储数据时,操作的是同一个 UserDefaults 键。

2、区别

变量名不同

private var currentLanguage: String = "en"

private var storedLanguage: String = "en"

虽然它们都绑定到 UserDefaults 的同一个键 “currentLanguage”,但在 Swift 代码中,它们是两个不同的变量。

总结

@AppStorage 是 SwiftUI 的一个便捷工具,它能帮助你以响应式的方式将视图状态与 UserDefaults 中的数据关联起来,大大简化了保存和读取用户设置的代码。这样可以让应用在多个启动周期之间保持一致的用户体验。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注