我正在对Dictionary进行扩展,只是一种方便的方法来遍历深度json结构以找到可能存在的给定字典。在Dictionary的一般扩展中,我无法下标,因为我给了一个String而不是一个Key
extension Dictionary {
func openingHoursDictionary() -> Dictionary<String,AnyObject>? {
if let openingHours = self["openingHours"] as? Array<AnyObject> {
// traverses further and finds opening hours dictionary
}
return nil
}
}
Error: String is not convertible to DictionaryIndex<Key, Value>
on self["openingHours"]
如何从Key
String
制作"openingHours"
或查看字典中的字符串?
答案 0 :(得分:0)
使用String
Key
转换为"openingHours" as Key
if let pickupPoints = self["openingHours" as Key] as? Array<AnyObject> {
}
缺点是,如果这样做,如果我有一个Dictionary<Int,AnyObject>
并且使用那里的方法,我将会崩溃。
0x10e8c037d: leaq 0x362aa(%rip), %rax ; "Swift dynamic cast failure"
答案 1 :(得分:0)
您可以在运行时检查该字符串是否为字典的有效密钥:
extension Dictionary {
func openingHoursDictionary() -> [String : AnyObject]? {
if let key = "openingHours" as? Key {
if let openingHours = self[key] as? Array<AnyObject> {
// traverses further and finds opening hours dictionary
}
}
return nil
}
}
但如果要求其他词典,这将“默默地”返回nil
比如[Int, AnyObject]
。
如果您希望编译器检查下标是否安全 带字符串的字典然后你必须使用(通用)函数:
func openingHoursDictionary<T>(dict : [String : T]) -> [String : AnyObject]? {
if let openingHours = dict["openingHours"] as? Array<AnyObject> {
// traverses further and finds opening hours dictionary
}
return nil
}
(目前)无法编写Dictionary
(或Array
)
仅适用于受限类型的扩展方法
通用参数。