我收到错误“致命错误:在解开可选值时意外发现nil” . 我试图从我的服务器获取JSON作为字典 . 如果数据为零,如何抛出错误?
let jsonUrl = "jsonurl"
let session = NSURLSession.sharedSession()
let shotsUrl = NSURL(string: jsonUrl)
let task = session.dataTaskWithURL(shotsUrl!, completionHandler: {
(data,response,error) -> Void in
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) // Get error
dispatch_async(dispatch_get_main_queue()) {
for newData in json as! [Dictionary<String, AnyObject>] {
// do stuff
}
}
} catch {
}
})
task.resume()
编辑:澄清一下,我正在测试当没有互联网连接时,它应该忽略抛出的错误,而不是它给出错误 . 我试过了
guard let data = data else { return }
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
但它说“不能在let json线上强行打开可选类型'NSData'”
2 回答
而不是保护
data
参数处理完成处理程序中返回的error
. 如果没有error
那么data
可以安全地解开 .并在
catch
范围内添加适当的错误处理 . 这似乎很烦人,但可能非常有用 . ;-)你是通过说
data!
强制解包数据 . 这意味着如果它希望数据不是零,那么如果没有互联网连接,它将永远是 . 在强制解包之前,至少需要检查数据是否为nil,然后在nil时处理你想要的对象创建方式 .