Swift 2.1代码没有任何问题:
let userDetail = response["params"]?["users"]
我更新到运行Swift 2.2的Xcode 7.3。并且它开始在同一行上面抱怨。 抱怨如下:
可选类型AnyObject的值?没有打开;你的意思是使用'!'或'?' ?
当我自动更正xcode建议时,它会给我以下代码作为更正的代码:
let userDetail = response["params"]?!["users"]
此处的回复类型为AnyObject?
我不想在这里强行打开一个可选项。
有人知道这里的问题是什么吗?而Swift 2.2中的选项有什么变化,这给了我这个错误。
答案 0 :(得分:3)
对于字典[K: V]
,下标的返回类型为V?
,因此在您的情况下,response["params"]
的返回类型为AnyObject??
,因为V == AnyObject?
}。要恢复AnyObject
需要解开两次:
// swift 2.2 only:
// v
let userDetail = response["params"]??["users"]
// note: the type of userDetail is still `AnyObject??`
我不确定Swift 2.2中有什么变化,也许检查变得更加严格。
更新:在Swift 3中,userDetail
的类型变为Any??
,您无法链接更多下标。事实上,Swift 3的JSONSerialization是changed to return Any
instead of AnyObject
,所以你甚至不能写response["params"]
。请考虑使用SwiftyJSON之类的专用JSON包。
答案 1 :(得分:2)
Swift 2.2对从字典键返回的AnyObject
的键/索引订阅更具限制性。
您可以对期望的类型
使用链式可选绑定检查if let userDetail = response["params"] as? [String:AnyObject], users = userDetail["users"] as? Whatever {}