投射任何对象? [String:AnyObject?] 总是失败

Cast AnyObject? to [String:AnyObject?] always failing

最初我在 Swift 2.1

中有这段代码
func onSuccess(jsonData: AnyObject?){
    print(jsonData["message"]) 
}

升级到 Swift 2.2 后,出现

这样的错误

Ambiguous reference to 'subscript'

对于行 print(jsonData["message"])

我把我的代码改成了这个

func onSuccess(jsonData: AnyObject?) {

        let json = (jsonData as? [String:AnyObject?]) ?? ["":""]
        print(json)
}

但是这个语句总是失败,因为 AnyObject?到 [String:AnyObject?] 类型转换没有发生并获得 nil 合并值。我想输入从 AnyObject?[String:AnyObject] 的类型。可能吗?

您可以像这样简单地使用可选绑定:

func onSuccess(jsonData: AnyObject?) {
    if let json = jsonData as? [String:AnyObject] {
        print(json["message"])
    }
}

没有充分的理由将字典值声明为像 [String:AnyObject?] 这样的可选值,因为 Swift 字典总是 return 可选值。

此示例用于解码字典。

现在,如果您的 jsonData 不是字典而是字典数组,您只需调整类型:

func onSuccess(jsonData: AnyObject?) {
    if let json = jsonData as? [[String:AnyObject]] {
        for object in json {
            print(object["message"])
        }
    }
}

等等

你得到 Ambiguous reference to 'subscript' 因为你在 Swift 2.2 中的 jsonData["message"] 你应该使用 objectForKey 而不是 ["key"]。在您的情况下,您应该像这样编写代码 jsonData.objectForKey("message") 那是您的第一个问题。

你的第二个问题答案是你确定你的JSON数据是字典吗?我认为您的数据是 字典数组 。如果我是对的。您应该像这样将您的 jsonData 转换为字典数组

if let json = jsonData as? [[String:AnyObject?]] {
    for data in jsonData { // Enumerate the array of dicts to get value.
        print(data.objectForKey("message"))
    }
}