首页 文章

在阅读JSON时解包可选值时出乎意料地发现了nil [关闭]

提问于
浏览
-5

我收到错误“致命错误:在解开可选值时意外发现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 回答

  • 1

    而不是保护 data 参数处理完成处理程序中返回的 error . 如果没有 error 那么 data 可以安全地解开 .

    let task = session.dataTaskWithURL(shotsUrl!, completionHandler: {
        (data,response,error) -> Void in
        if error != nil {
          // do proper error handling
    
        } else {
            do {
            let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
            ...
    

    并在 catch 范围内添加适当的错误处理 . 这似乎很烦人,但可能非常有用 . ;-)

  • 0

    你是通过说 data! 强制解包数据 . 这意味着如果它希望数据不是零,那么如果没有互联网连接,它将永远是 . 在强制解包之前,至少需要检查数据是否为nil,然后在nil时处理你想要的对象创建方式 .

    if data != nil {
            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 {
    
            }
    } else {
        //handle object creation if data is nil
    }
    

相关问题