使用的语言: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上的错误还是我做错了什么?
答案 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
}