1

最初我在 Swift 2.1 中有这段代码

func onSuccess(jsonData: AnyObject?){
    print(jsonData["message"]) 
}

升级到 Swift 2.2 后,出现错误,例如

对“下标”的模糊引用

为线print(jsonData["message"])

我把我的代码改成了这个

func onSuccess(jsonData: AnyObject?) {

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

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

4

2 回答 2

3

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

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

没有充分的理由将字典值声明为 Optional,[String:AnyObject?]因为 Swift 字典总是返回 Optionals。

此示例用于解码字典。

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

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

等等。

于 2016-04-04T09:16:26.287 回答
1

你得到Ambiguous reference to 'subscript'的原因是你jsonData["message"]在 Swift 2.2 中应该使用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"))
    }
}
于 2016-04-04T09:21:24.057 回答