如何在Swift中转换Key和String?

时间:2015-01-24 09:46:10

标签: ios swift dictionary

我正在对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"或查看字典中的字符串?

2 个答案:

答案 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) 仅适用于受限类型的扩展方法 通用参数。