我正试图从嵌套字典中获取一个int。我的代码如下
convenience init(fromDict dict: [String:Any]) {
let dfs = dict["forms"] as? [[String :[String:Any]]]
self.init(
atk: dfs?[0]["stats"]?["atk"] as? Int ?? 0,
def: dfs?[0]["stats"]?["def"] as? Int ?? 0,
)
}
然而,结果不断上升0.我确定这是正确的文件路径,为什么它不显示正确的整数?下面是我抓住的plist路径。非常感谢任何有关此事的帮助。
<array>
<dict>
<key>forms</key>
<array>
<dict>
<key>stats</key>
<dict>
<key>atk</key>
<integer>49</integer>
<key>def</key>
<integer>49</integer>
</dict>
</dict>
</array>
</dict>
<array/>
答案 0 :(得分:1)
你真的不应该滥用这样的可选链接。你基本上是在乞求这样的错误。
dfs
是nil
,因为您正在尝试将其投放到[[String :[String:Any]]]
(又名Array<Dictionary<String, <Dictionary<String, Any>>>
),但其实际类型为[String :[String:Any]]
(又名Dictionary<String, <Dictionary<String, Any>>
)。
如果你有适当的可选处理,你会立即注意到这个错误。
convenience init(fromDict dict: [String:Any]) {
guard let let dfs = dict["forms"] as? [String :[String:Any]] else {
fatalError("Failed trying to cast dfs")
}
guard let stats = dfs["stats"] else {
fatalError("No value for \"stats\" key.")
}
guard let atk = stats["atk"] as? Int else {
fatalError("Missing or invalid value for \"atk\" key")
}
guard let def = stats["def"] as? Int else {
fatalError("Missing or invalid value for \"def\" key")
}
self.init(
atk: atk,
def: def,
)
}
答案 1 :(得分:0)
所以我发现了问题的问题。我正在同时读取多个源文件,其中一个没有"stats"
字典。
我认为我有两个选择:创建If-let
语句以检查"stats"
或从流氓源文件中复制我需要的内容并完全删除它。我选择了后者,因为已知该源文件在过去给我带来麻烦