【发布时间】:2020-09-20 17:19:55
【问题描述】:
这是我最后一个问题struggling with value assignment to optional class variable 的延续,David 为我提供了一个类似问题的很好的提示。 经过多次迭代,我现在想出了一个不同的方法,但是,它仍然失败,我不知道为什么(基本上会发生什么)
我有类定义
struct HighScores: Codable {
var Scores:Int
var highscoreRecord: [HighscoreRecord]
}
struct HighscoreRecord: Codable {
var Rank:Int
var Date:String?
var avDuration:Float?
var Score:Int?
var Tries:Int?
}
在视图控制器中,我声明了一个 HighScores 类型的变量,它可以从 JSON 文件中读取数据,也可以在设置第一个高分时对其进行初始化。
class GameplayViewController: UIViewController {
var jsonResult: HighScores?
...
if firstHighscore == 1 {
jsonResult?.Scores = 1
jsonResult?.highscoreRecord.append(HighscoreRecord(Rank: 1, Date: formatter.string(from: dateStart), avDuration: Float(lblSpeed.text ?? "0.0"), Score: Int(lblRatio.text ?? "0"), Tries: hits + misses))
...
print(jsonResult)
这会编译并运行。但是,如果我监控 jsonResult 变量,它在分配 Scores 和 highscoreRecord 值后仍然显示 nil。
会发生什么,为什么我可以在没有错误且没有实际分配的情况下分配一个值? 首先,我如何将我的值放入 jsonResult?
干杯
【问题讨论】:
-
自上一个问题以来,您仍然没有给
jsonResult一个值,所以它仍然是 nil。你需要做jsonResult = ...。 -
这里发生的情况是,当在
jsonResult?.Scores = 1中使用?时,您是说 if jsonResult 不是 nil 然后将 1 分配给Scores否则执行没什么,所以编译器或运行时没有什么可抱怨的,因为代码是正确的。因此,您需要调查代码中需要实例化jsonResult属性的位置 -
在提出上面的代码之前,我尝试了 jsonResult?.highscoreRecord = [HighscoreRecord]() 的多种变体
-
在提出上面的代码之前,我尝试了许多 jsonResult?.highscoreRecord = [HighscoreRecord]() 的变体,但都没有成功。所以我很高兴上面的代码没有抛出错误。那么在给定它背后的类结构的情况下,我如何将初始值传递给 jsonResult 呢?
标签: arrays swift class nested initialization