【问题标题】:Initialize @Published var SwiftUI初始化@Published var SwiftUI
【发布时间】:2020-04-20 02:38:53
【问题描述】:

我有以下

import Foundation


class TimeToEatTrackerViewModel: ObservableObject {

@Published var currentMeal: Int = UserDefaults.standard.integer(forKey: "CurrentMeal") {
    didSet {
        UserDefaults.standard.set(self.currentMeal, forKey: "CurrentMeal")
    }
}

@Published var startDay: Bool = UserDefaults.standard.bool(forKey: "startDay") {

    didSet {
        UserDefaults.standard.set(self.startDay, forKey: "startDay")
    }
}

}

我需要用true 初始化startDay,我该怎么做?我尝试了几种方法,但都不起作用,比如将它放在 didSet 之上:

init(){
         startDay = false
      }

谢谢

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    这是可能的变体

    @Published var startDay: Bool
    
    init() {
        startDay = true
        if let storedDay = UserDefaults.standard.value(forKey: "startDay") {
            startDay = storedDay as! Bool
        }
    }
    

    【讨论】:

    • 为什么要新建一个变量名storedDay,它的含义是什么?
    • @Arturo,通过从 UserDefaults 获取值,可以知道它是否之前存储过,因此仅使用真正存储的值覆盖默认值,而不是将 nil 转换为 bool false。
    • 嗨,我怎样才能用字典做同样的实现?
    • @Arturo,我来不及在那里发布我的答案:)...在那个问题条件下,您所需要的只是明确指定字典的类型@Published var mealAndStatus: [String: String] 和所有工作。经过测试。
    【解决方案2】:

    不清楚你在这里问什么。 如果您希望在运行应用程序时始终将 startDay 初始化为 true,那么:

    @Published var startDay: Bool = true {
        didSet {
            UserDefaults.standard.set(self.startDay, forKey: "startDay")
        }
    }
    

    【讨论】:

    • 如果我这样做,该值将始终设置为 true。在这种情况下,UserDefaults 的目标是存储 startDay 的先前值。您的实现始终将其设置为 true。我需要它一次性的东西,例如第一次安装应用程序时
    猜你喜欢
    • 2019-11-03
    • 2020-11-10
    • 2020-10-24
    • 2019-11-03
    • 1970-01-01
    • 2014-04-10
    • 2010-10-03
    相关资源
    最近更新 更多