我在Swift中创建了一个循环动态字典的函数,但是当我尝试检查该值是否为Dictionary类型时,类型比较条件总是失败,实际上XCode会提示以下警告:
Cast from '(key: String, value: Any)' to unrelated type 'Dictionary<String, Any>' always fails.
我没有尝试转换任何值,我只想检查变量值是否具有Dictionary类型。
这是我的代码:
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)
我使用的是Swift 3.0.1。
答案 0 :(得分:4)
enumerated()
从0开始创建一系列连续的Int
,与您调用它的序列元素配对。这不是你想要的 - 你只想迭代给定字典的键值对。所以只需删除.enumerated()
,然后直接迭代字典。
您还希望使用条件类型转换而不是简单的is
检查,允许val
在成功分支中静态输入[String : Any]
(否则您赢了'能够将其传递回readNode(node:level:)
)。
// ...
for (key, val) in node {
if let val = val as? [String : Any] {
print("Key \(key):")
readNode(node: val, level: (level + 1) * 2)
} else {
print("Key \(key): \(val)")
}
}
// ...