尝试解析价值?和守卫返回不同的价值观

时间:2017-11-22 04:08:42

标签: swift

使用的语言:Swift 3

Xcode版本:8.3.2(8E2002)

我在Data上有一个扩展程序,可将数据解析为JSONObject类型Any

extension Data {
    func toJsonObject() -> Any? {
        do {
            return try JSONSerialization.jsonObject(with: self, options: [])
        } catch {
            print(error)
        }
        return nil
    }
}

现在奇怪的是当我使用guard时,使用toJsonObject()try?

时结果对象似乎有所不同

例如

guard let dictionary = data.toJsonObject() as? [String: Any] else {
    return
}
  

dictionary现在属于[String: Any]

类型

然而,当我使用它时:

guard let dictionary = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else {
    return
}
  

dictionary现在属于[String: Any]?

类型

第二个代码块的结果不应该是[String: Any]而不是可选的[String: Any]?

这是Swift上的错误还是我做错了什么?

1 个答案:

答案 0 :(得分:1)

这是Swift的一个功能,我会说。 try?的使用意味着这将成为双重可选,它试图直接解码为as? [String: Any]的转换。将其插入并检查其类型以查看双重可选操作:

// Becomes a type of `[String : Any]??`
let dictionary = try? JSONSerialization.jsonObject(with: Data(), options: []) as? [String: Any] 

我认为您想要的答案是添加一些括号来澄清您的意图:

guard let dictionary = (try? JSONSerialization.jsonObject(with: Data(), options: [])) as? [String: Any] else {
    return
}