请考虑以下代码:
extension Dictionary {
public func msArray(_ key: Key) -> [Dictionary<String, Any>] {
return (self[key] as? Array<[String : Int]> ?? [])
}
}
let dict = ["Warlock" : ["Hp" : 100], "Rogue" : ["Hp" : 150], "Warrior" : ["Hp" : 250]]
产生[]:
print(dict.msArray("Warlock"))
为什么呢?是不是打算打印["Hp" : 100]
?
答案 0 :(得分:3)
返回类型的问题。对于您想要的结果,需要将返回类型添加为字典从扩展名而不是数组。
请检查此代码。
extension Dictionary {
public func msArray(_ key: Key) -> [String : Any] {
return self[key] as? [String : Any] ?? [:]
}
}
let dict = ["Warlock" : ["Hp" : 100], "Rogue" : ["Hp" : 150], "Warrior" : ["Hp" : 250]]
print(dict.msArray("Warlock"))
答案 1 :(得分:2)
return (self[key] as? Array<[String : Int]> ?? [])
在这里,您将self[key]
作为数组进行投射,当它实际上是Dictionary
时,这就是它失败并返回默认值[]
的原因。
您可以这样修复:
extension Dictionary {
public func msArray(_ key: Key) -> [Dictionary<String, Any>] {
return ([self[key]] as? Array<[String : Any]> ?? [])
}
}
答案 2 :(得分:1)
["Hp" : 100]
是[String : Int]
而非Array<[String : Int]>
。这就是你的msArray
函数返回[]
的原因。将您的扩展名更改为:
extension Dictionary {
public func msArray(_ key: Key) -> [String:Int]{
return self[key] as? [String : Int] ?? [:]
}
}