Swift 2.2可选类型自动更正

时间:2016-04-18 13:37:37

标签: swift

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中的选项有什么变化,这给了我这个错误。

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 {}