我正在使用以下结构从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为初始化。然后,我可以在需要时添加评级值。