SwiftUI UserDefaults的使用详解和代码演示

47 min read

UserDefaults 是一个轻量级的本地存储机制,可用于保存应用程序的偏好设置、用户授权状态等。

在 SwiftUI 中使用 UserDefaults 非常简单,下面是使用 UserDefaults 的详细步骤和代码演示:

  1. 定义默认值

首先,我们需要为存储在 UserDefaults 中的值定义默认值。为此,我们可以使用 Swift 中的 Dictionary 类型,并将其保存为静态成员变量。

struct UserDefaultsManager {
    static let defaults = UserDefaults.standard
    
    static let defaultValues: [String: Any] = [
        "username": "",
        "password": "",
        "isRememberMeOn": false
    ]
}

在上面的代码中,我们定义了三个默认值:用户名、密码和一个布尔值,用于指示是否要记住用户的登录信息。默认情况下,这些值都不应该存在,因此我们将其设置为空字符串和 false。

  1. 读/写数据

一旦定义了默认值,我们就可以开始读/写数据了。在 SwiftUI 中,可以使用 @AppStorage 或 @SceneStorage property wrappers 来轻松读写 UserDefaults 数据。

struct ContentView: View {
    @AppStorage("username", store: UserDefaultsManager.defaults) var username: String = UserDefaultsManager.defaultValues["username"] as! String
    @AppStorage("password", store: UserDefaultsManager.defaults) var password: String = UserDefaultsManager.defaultValues["password"] as! String
    @AppStorage("isRememberMeOn", store: UserDefaultsManager.defaults) var isRememberMeOn: Bool = UserDefaultsManager.defaultValues["isRememberMeOn"] as! Bool
    
    var body: some View {
        VStack {
            TextField("Username", text: $username)
            SecureField("Password", text: $password)
            Toggle("Remember Me", isOn: $isRememberMeOn)
            Button("Save") {
                UserDefaultsManager.defaults.setValue(username, forKey: "username")
                UserDefaultsManager.defaults.setValue(password, forKey: "password")
                UserDefaultsManager.defaults.setValue(isRememberMeOn, forKey: "isRememberMeOn")
            }
        }
    }
}

在上面的代码中,我们通过使用 @AppStorage 和 UserDefaults 实例来读取和写入数据。注意,在读取数据时,我们还需要使用默认值,以确保在没有存储任何值时返回正确的值。

此外,在点击“保存”按钮时,我们还可以使用 UserDefaults 的 setValue(_:forKey:) 方法直接将数据写入 UserDefaults 中。

  1. 更新界面

最后,我们还需要确保当数据存储更改时,界面可以及时更新。对于普通的 SwiftUI View,我们可以通过将需要更新的值绑定到 @State 或 @Binding 属性来实现。

struct ContentView: View {
    @AppStorage("username", store: UserDefaultsManager.defaults) var username: String = UserDefaultsManager.defaultValues["username"] as! String
    @AppStorage("password", store: UserDefaultsManager.defaults) var password: String = UserDefaultsManager.defaultValues["password"] as! String
    @AppStorage("isRememberMeOn", store: UserDefaultsManager.defaults) var isRememberMeOn: Bool = UserDefaultsManager.defaultValues["isRememberMeOn"] as! Bool
    
    @State private var isLoggedIn: Bool = false
    
    var body: some View {
        if isLoggedIn {
            Text("Welcome, \(username)!")
        } else {
            VStack {
                TextField("Username", text: $username)
                SecureField("Password", text: $password)
                Toggle("Remember Me", isOn: $isRememberMeOn)
                Button("Login") {
                    isLoggedIn = true
                    UserDefaultsManager.defaults.setValue(username, forKey: "username")
                    UserDefaultsManager.defaults.setValue(password, forKey: "password")
                    UserDefaultsManager.defaults.setValue(isRememberMeOn, forKey: "isRememberMeOn")
                }
            }
        }
    }
}

在上面的代码中,我们使用一个简单的布尔值(isLoggedIn)来切换视图状态。如果用户已登录,则显示欢迎消息,否则显示登录表单。

当用户点击“登录”按钮并成功登录时,我们将 isLoggedIn 属性设置为 true,并使用 UserDefaults 存储用户输入的值。这将导致界面重新构建,并切换视图状态。

总结

通过使用 @AppStorage 和 UserDefaults 实例,我们可以轻松读取和写入 UserDefaults 数据。在读取数据时,我们还需要使用默认值来确保在没有存储任何值时返回正确的数据。最后,我们可以使用 @State 或 @Binding 属性来将 UserDefaults 数据绑定到视图状态,以便在存储更改时更新界面。