如何检查值类型是否为 Dictionary<String, Any>

Jua*_*ago 3 swift

我在 Swift 中创建了一个循环动态字典的函数,但是当我尝试检查该值是否为字典类型时,类型比较条件总是失败,事实上 XCode 会引发以下警告作为提示:

Cast from '(key: String, value: Any)' to unrelated type 'Dictionary<String, Any>' always fails.
Run Code Online (Sandbox Code Playgroud)

我不想转换任何值,我只是想检查变量值是否具有字典类型。

这是我的代码:

    func readNode(node: Dictionary<String, Any>, level: Int)
    {

        // Print spaces
        for _ in 0 ... level
        {
            print(" ")
        }


        for (key, val) in node.enumerated()
        {

            // The following condition is always false (here is the issue)                
            if val is Dictionary<String, Any> {
                print("Key \(key):")
                readNode(node: val, level: (level + 1) * 2)
            }
            else
            {
                print("Key \(key): \(val)")
            }

        }

    }

    var mydict = Dictionary<String, Any>()

    mydict = ["subindex2": 2, "subindex3": 3, "subindex4": ["whatever": "extra"]]

    readNode(node: mydict, level: 0)
Run Code Online (Sandbox Code Playgroud)

我正在使用 Swift 3.0.1。

Ham*_*ish 5

enumerated()创建从 0 开始的连续 s 序列Int,并与调用它的序列中的元素配对。这不是您想要的 \xe2\x80\x93 您只想迭代给定字典的键值对。所以只需删除.enumerated(),然后直接迭代字典即可。

\n\n

您还需要使用条件类型转换而不是简单的is检查,从而val允许像[String : Any]在成功分支中一样静态类型化(否则您将无法将其传递回readNode(node:level:))。

\n\n
// ...\n\nfor (key, val) in node {\n    if let val = val as? [String : Any] {\n        print("Key \\(key):")\n        readNode(node: val, level: (level + 1) * 2)\n    } else {\n        print("Key \\(key): \\(val)")\n    }\n}\n\n// ...\n
Run Code Online (Sandbox Code Playgroud)\n