在阅读JSON时展开可选值时出乎意料地发现了nil

时间:2016-01-14 15:13:43

标签: ios json swift

我收到错误"致命错误:在解开可选值"时意外地发现了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)

但它说&#34;无法强行打开可选类型&#39; NSData&#39;&#34;在让json线上

2 个答案:

答案 0 :(得分:1)

而不是 guard 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范围内添加适当的错误处理。这似乎很烦人,但可能非常有用。 ; - )

答案 1 :(得分:0)

您可以通过说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 } 强制解包数据。这意味着如果它希望数据不是零,那么如果没有互联网连接,它将永远是。在强制解包之前,至少需要检查数据是否为零,然后如果它是零则处理你想要的对象创建方式。

render() !this.state.clicked ? <View ref={firstView}> ... </View> : <View ref={secondView}> ... </View>