为什么我的词典项目会继续返回0?迅速

时间:2017-01-04 23:35:29

标签: ios arrays swift dictionary int

我正试图从嵌套字典中获取一个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/>

2 个答案:

答案 0 :(得分:1)

你真的不应该滥用这样的可选链接。你基本上是在乞求这样的错误。

dfsnil,因为您正在尝试将其投放到[[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"或从流氓源文件中复制我需要的内容并完全删除它。我选择了后者,因为已知该源文件在过去给我带来麻烦