SwiftUI:如何使用 UserDefaults 保留 @Published 变量? [英] SwiftUI: How to persist @Published variable using UserDefaults?

查看:45
本文介绍了SwiftUI:如何使用 UserDefaults 保留 @Published 变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望保留一个 @Published 变量,以便每次重新启动我的应用程序时它都是相同的.

I want a @Published variable to be persisted, so that it's the same every time when I relaunch my app.

我想对一个变量同时使用@UserDefault 和@Published 属性包装器.例如,我需要一个@PublishedUserDefault var isLogedIn".

I want to use both the @UserDefault and @Published property wrappers on one variable. For example I need a '@PublishedUserDefault var isLogedIn'.

我有以下 propertyWrapper

I have the following propertyWrapper

import Foundation

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

    init(_ key: String, defaultValue: T) {
        self.key = key
        self.defaultValue = defaultValue
    }

    var wrappedValue: T {
        get {
            return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
        }
        set {
            UserDefaults.standard.set(newValue, forKey: key)
        }
    }
}

这是我的设置类

import SwiftUI
import Combine

 class Settings: ObservableObject {

   @Published var isLogedIn : Bool = false

 func doLogin(params:[String:String]) {

        Webservice().login(params: params) { response in

            if let myresponse = response {                    
                    self.login = myresponse.login
                    }
               }
         }

}

我的视图类

struct HomeView : View {
    @EnvironmentObject var settings: Settings
    var body: some View {
        VStack {
            if settings.isLogedIn {
            Text("Loged in")
            } else{
            Text("Not Loged in")
            }
        }
    }
}

有没有办法制作一个涵盖持久化和发布的单一属性包装器?

Is there a way to make a single property wrapper that covers both the persisting and the publishing?

推荐答案

private var cancellables = [String:AnyCancellable]()

extension Published {
    init(wrappedValue defaultValue: Value, key: String) {
        let value = UserDefaults.standard.object(forKey: key) as? Value ?? defaultValue
        self.init(initialValue: value)
        cancellables[key] = projectedValue.sink { val in
            UserDefaults.standard.set(val, forKey: key)
        }
    }
}

class Settings: ObservableObject {
    @Published(key: "isLogedIn") var isLogedIn = false
    ...
}

示例:https://youtu.be/TXdAg_YvBNE

所有Codable 类型的版本请查看这里

Version for all Codable types check out here

这篇关于SwiftUI:如何使用 UserDefaults 保留 @Published 变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆