小编cbj*_*rup的帖子

SwiftUI:如何持久化 @EnvironmentObject 变量?

我想要一个变量作为 EnvironmentObject 并且我也希望它被持久化,这样每次我重新启动我的应用程序时它都是一样的。

为此,我已经创建了以下 propertyWrapper:

import Foundation

@propertyWrapper
struct UserDefault<T: Codable> {
    let key: String
    let defaultValue: T

    var wrappedValue: T {
        get {
            if let encodedValue = UserDefaults.standard.object(forKey: key) as? Data {
                let decoder = JSONDecoder()
                let decodedValue = try! decoder.decode(T.self, from: encodedValue)
                return decodedValue
            } else {
                return defaultValue
            }
        } set {
            let encoder = JSONEncoder()
            let encodedValue = try! encoder.encode(newValue)
            UserDefaults.standard.set(encodedValue, forKey: key)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是已经有一个属性包装器意味着我不能使用来自Combine 的@Published 属性包装器。(在一个变量上使用两个属性包装器听起来不是一个好主意,而且我还没有找到让它工作的方法。)

我通过创建一个自定义的objectWillChangelet 常量并.send(input:)在 willSet …

swift swiftui

5
推荐指数
1
解决办法
2021
查看次数

标签 统计

swift ×1

swiftui ×1