【问题标题】:Why does my Dictionary Item keep returning 0? Swift为什么我的字典项一直返回 0?迅速
【发布时间】:2023-03-12 14:32:02
【问题描述】:

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

【问题讨论】:

  • 使用调试器查看dfsdfs[0]dfs[0]["stats"]等的值
  • 你也可以在你的初始化中添加一个print(dict)。它应该打印["forms": [["stats": ["def": 49, "atk": 49]]]]
  • "forms": <__nscfarray>( { stats = { atk = 49; def = 49; };
  • 似乎您隐藏了数组中包含的其他一些元素,这可能是您的代码不起作用的原因。使用print(dict) 展示您获得的所有内容。
  • 文件其实很大,所以我只包含了相关部分。我正在尝试调试,我可以看到它可以读取 atk 和 def 但无法验证密钥

标签: ios arrays swift dictionary int


【解决方案1】:

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

dfsnil,因为您试图将其转换为 [[String :[String:Any]]](又名 Array&lt;Dictionary&lt;String, &lt;Dictionary&lt;String, Any&gt;&gt;&gt;),但它的实际类型是 [String :[String:Any]](又名Dictionary&lt;String, &lt;Dictionary&lt;String, Any&gt;&gt;)。

如果你有适当的可选处理,你会立即注意到这个错误。

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,
    ) 
}

【讨论】:

  • 抱歉我更新了帖子。 [[String :[String:Any]]] 实际上是正确的,因为它是一个字典数组。我还收到第一个致命错误尝试投射 dfs 失败。但我正在查看 plist,不明白为什么它会失败
  • 在那种情况下,当您使用我提供的代码时,您是否将演员表改回[[String :[String:Any]]]
  • 是的,我更新了它以反映正确的。错误仍然存​​在于第一个警卫上
【解决方案2】:

所以我发现了我的问题的问题。我正在同时读取多个源文件,其中一个没有 "stats" 字典。

我想我有两个选择:创建一个 If-let 语句来检查 "stats" 或从流氓源文件中复制我需要的内容并将其完全删除。我选择了后者,因为该源文件过去曾给我带来麻烦

【讨论】:

    猜你喜欢
    • 2018-02-11
    • 2021-11-18
    • 2013-01-26
    • 2017-07-04
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多