我的结构是从JSON初始化的,但后来需要添加值



我正在使用以下结构从JSON读取。

struct ConsumedRecipe: Codable {
    var name: String
    var userStats: Stats?
    var globalStats: Stats?
    struct Stats: Codable {
        var rating: Double?
        var time: TimeInterval?
    }

    init(name: String, userStats: Stats, globalStats: Stats) {
        self.name = name
        self.userStats = userStats
        self.globalStats = globalStats
    }
}

假设GlobalStats具有读取的值,但Userstats没有。所以他们是零。

在应用程序执行中,我获得了userstats.sating的值。如果我尝试直接分配评级,则保持零。

例如:

userStats.rating = 2.0 remains nil.

我以为这与整个统计数据子结构(我不确定正确的术语是什么)有关。因此,我尝试添加以下中间步骤。

 var tempStats: Stats! = Stats()
        tempStats.rating = 2.0
      userStats? = tempStats

这仍然留下了userstat的价值。

我在这里想念什么?我是否纠正这是一些初始化问题?

附加信息:

我认为我的问题可能与JSON的初始代码有关:

  init?(json: Data) // take some JSON and try to init a ConsumedRecipe from it
    {
       do {
        let newValue =  try JSONDecoder().decode(ConsumedRecipe.self, from: json)
        self = newValue
    } catch let error as NSError {
        print("Reading Recipe Failed: (error)")
        return nil
    }
}

那些意味着我以后不能那一部分(userstats)?

通过应用程序执行,我的意思是用户使用评级控件来给出值。我看到它通过打破执行和检查是无效的。

我以一种非优雅的方式解决了这个问题。但是相信我理解原因。我允许Swift在上述" INIT?(JSON:DATA)"的JSON文件中阅读。这样可以很好地工作,因为上面示例中未包含的JSON文件的几个详细信息。这节省了写入完整的JSON逻辑 - 特别是处理空的逻辑。但是,nulls可能会崩溃。因此,用户评分(将为null)不在JSON文件中。因此,在读取中未初始化统计结构。在需要时,显然也无法在以后进行初始化。(用户给予评级反馈。)

我的解决方案是在结构中添加非可选属性"代码",如下所示:

  struct Stats: Codable {
        var code: String
        var rating: Double?
        var time: TimeInterval?
    }

然后在JSON中添加:

   "userStats": {
        "code":  "user"
    },

我目前不使用属性代码,但是我的USERSTATS结构以NIL为初始化。然后,我可以在需要时添加评级值。