SwiftUI中简单的概念:AppStorage与 UserDefaluts

334 阅读2分钟

@AppStorageUserDefaults 都是 Swift 中用于持久化存储用户数据的方法,但它们有一些不同的使用场景和便捷性。

UserDefaults

UserDefaults 是一种非常通用的存储方式,可以用于任何 Swift 代码中。它适用于存储轻量级的用户偏好设置和简单数据。通常用于 UIKit 和非 SwiftUI 的项目中。

import Foundation

// 存储数据
let defaults = UserDefaults.standard
defaults.set("Hello, UserDefaults", forKey: "myKey")

// 读取数据
if let savedString = defaults.string(forKey: "myKey") {
    print(savedString) // 输出:Hello, UserDefaults
}

@AppStorage

@AppStorage 是 SwiftUI 的属性包装器,用于将值存储在 UserDefaults 中,并且可以自动更新 SwiftUI 的视图。它简化了在 SwiftUI 中使用 UserDefaults 的流程,能够使代码更加简洁和直观。

import SwiftUI

struct ContentView: View {
    @AppStorage("myKey") var myStoredValue: String = "Default Value"

    var body: some View {
        VStack {
            Text(myStoredValue) // 输出存储的值
            Button("Change Value") {
                myStoredValue = "Hello, AppStorage" // 修改存储的值
            }
        }
    }
}

区别总结

  1. 使用场景

    • UserDefaults:适用于所有 Swift 代码,尤其是 UIKit 和非 SwiftUI 的项目。
    • @AppStorage:专为 SwiftUI 设计,简化了在 SwiftUI 中使用 UserDefaults 的流程。
  2. 代码简洁性

    • UserDefaults:需要手动存取和更新数据。
    • @AppStorage:使用属性包装器,可以自动绑定到 SwiftUI 的视图,简化了代码。
  3. 数据绑定

    • UserDefaults:需要手动通知视图更新。
    • @AppStorage:自动更新绑定的视图,符合 SwiftUI 的声明式编程风格。

示例对比

使用 UserDefaults

import SwiftUI

struct ContentView: View {
    @State private var myStoredValue: String = UserDefaults.standard.string(forKey: "myKey") ?? "Default Value"

    var body: some View {
        VStack {
            Text(myStoredValue)
            Button("Change Value") {
                myStoredValue = "Hello, UserDefaults"
                UserDefaults.standard.set(myStoredValue, forKey: "myKey")
            }
        }
    }
}

使用 @AppStorage

import SwiftUI

struct ContentView: View {
    @AppStorage("myKey") var myStoredValue: String = "Default Value"

    var body: some View {
        VStack {
            Text(myStoredValue)
            Button("Change Value") {
                myStoredValue = "Hello, AppStorage"
            }
        }
    }
}

使用 @AppStorage 的代码明显更简洁,并且更符合 SwiftUI 的设计理念。这种方式自动处理了数据的存储和视图的更新,减少了手动操作的复杂性。