swift - 我的结构从 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)?
解决方案
通过应用程序执行,我的意思是用户正在使用评级控件来给出一个值。我通过中断执行和检查看到它为空。
我以一种相当不优雅的方式解决了这个问题。但相信我明白原因。我允许 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 结构初始化为评级为零。然后,我可以稍后在需要时添加评级值。
推荐阅读
- c# - 是否可以在 c# 中的所有线程中维护成员变量值
- excel - if 块的应用程序定义或对象定义错误
- php - 将 MongoDB 连接到项目 - 错误
- vue.js - 如何在 Vue Echarts 中创建饼图?
- swift - RxSwift 单独的流
- r - geom_beeswarm 和手动设置颜色 (scale_fill_manual)
- python - 如何在 python 代码中将一个文件夹的数据从 Blob 存储复制到另一个 Blob 存储?
- python - 在 Python 中使用 for ... in range 循环查找某个区间内的素数
- android - 在 JNI C 中检查包是否安装在 android 设备上
- vue.js - 如何在 vuex 模块中调用 vue 方法?