快速理解自我[关键]和铸造

时间:2017-11-14 05:40:33

标签: swift

请考虑以下代码:

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]

3 个答案:

答案 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] ?? [:]
   }
}