将AnyObject转换为String时,类型'String'不符合协议'NSCopying'错误

时间:2014-07-28 03:41:16

标签: ios string swift nsdictionary

我要解析像这样的JSON格式:

{ 
    "key_1" : {
        "key_2" : "value"
    }

}

然后将"value"分配给变量。

这是我的代码:

var variableShouldBeAssigned: String
if let x = (jsonResult["key_1"]? as? NSDictionary) {
    if let y = (x["key_2"]? as? String) {
        variableShouldBeAssigned = y
    }
}

但是,当我尝试从x["key_2"]?向下转换为字符串时会发生错误,但从jsonResult["key_1"]?向NSDictionary转发是不错的。

我可以使用x["key_2"]替换x["key_2"]?来解决错误,但我真的不知道为什么它只适用于jsonResult["key_1"]?

有人可以告诉我原因吗?

2 个答案:

答案 0 :(得分:5)

String不符合NSCopying,但NSString确实如此! 此外,从NSString到String也是瞬间隐含的......

所以我会说尝试这样的事情......将 字符串 更改为 NSString

这是一个示例,假设您将jsonResult作为NSDictionary处理......

func giveDictionary(jsonResult:NSDictionary) -> String?
{

    if let x = (jsonResult["key_1"]? as? NSDictionary)
    {
        if let y = (x["key_2"]? as? NSString)
        {
            return y
        }
    }
    return nil
}

答案 1 :(得分:3)

您可以在开头使用Swift词典简化所有类型检查:

var variableShouldBeAssigned: String
if let dict = jsonResult as? [String:[String:String]] {
    if let key1Dict = dict["key_1"] {
        if let value = key1Dict["key_2"] {
            variableShouldBeAssigned = value
        }
    }
}

实际上,您甚至可以将最后两个if语句组合在一起:

var variableShouldBeAssigned: String
if let dict = jsonResult as? [String:[String:String]] {
    if let value = dict["key_1"]?["key_2"] {
       variableShouldBeAssigned = value
    }
}

通常,您应该使用Swift Dictionaries而不是NSDictionary