首页 > 解决方案 > 我的结构从 JSON 初始化为 nil 但稍后需要添加值

问题描述

我正在使用以下结构从 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.rating 的值。如果我尝试直接分配评级,它仍然为零。

例如:

userStats.rating = 2.0 remains nil.

我假设这与整个 Stats 子结构(我不确定正确的术语是什么)为零有关。所以我尝试添加以下中间步骤。

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

      userStats? = tempStats

这仍然使 userStats.rating 的值为零。

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

附加信息:

我认为我的问题可能与来自 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)?

标签: swiftstructinitialization

解决方案


通过应用程序执行,我的意思是用户正在使用评级控件来给出一个值。我通过中断执行和检查看到它为空。

我以一种相当不优雅的方式解决了这个问题。但相信我明白原因。我允许 Swift 读取上面的 JSON 文件“init?(json:Data)”。这很好用,因为 JSON 文件实际上有几个细节没有包含在上面的示例中。这节省了编写完整的 JSON 逻辑——特别是处理空值。但是,空值可能会使读取崩溃。因此,用户评分(将为空)不在 JSON 文件中。因此 Stats 结构没有在读取中初始化。显然也不能在以后需要时对其进行初始化。(用户给出评分反馈后。)

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

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

然后在 JSON 中添加:

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

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


推荐阅读