【问题标题】:Swift 2.2 Optional Type autocorrectionSwift 2.2 可选类型自动更正
【发布时间】:2016-08-10 06:56:27
【问题描述】:

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 中的选项发生了哪些变化,这给了我这个错误。

【问题讨论】:

  • userDetail的类型是什么?
  • 它是字典类型。我访问其中的值,例如: userDetail?["gender"] as?字符串

标签: swift


【解决方案1】:

对于字典[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 包。

【讨论】:

    【解决方案2】:

    Swift 2.2 对从字典键返回的 AnyObject 的键/索引订阅更加严格。

    您可以使用链式可选绑定检查预期类型,

    if let userDetail = response["params"] as? [String:AnyObject], users = userDetail["users"] as? Whatever {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 2019-01-12
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多