在使用 json API 结果和 NSDictionary 时展开可选值时意外发现 nil

Unexpectedly found nil while unwrapping an Optional value when using json API result and NSDictionary

我正在尝试使用 API 每 0.5 秒获取一次 json 数据。 API 允许每秒数千个请求,但有时当 运行 应用程序时,我会遇到此崩溃:

fatal error: unexpectedly found nil while unwrapping an Optional value

这是我用来获取 json 数据的代码。

    var url : String = "URL.COM" 
    var request : NSMutableURLRequest = NSMutableURLRequest

    request.URL = NSURL(string: url)
    request.HTTPMethod = "GET"

    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse?, data: NSData?, error: NSError?) -> Void in
        var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil
        let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers, error: error) as NSDictionary

谁能告诉我如何防止这种情况发生?我理解为什么数据偶尔可能为零,但我希望程序继续检查,无论它是否为零,因为它很快就会不是零。

您应该在灭菌之前添加:

if data == nil 
{
   println("data is nil")
   return
}

问题出在数据上。它可以是 nil,但您使用 ! 展开它,这意味着:"I know there's some data inside here, unwrap it"。问题是没有数据。

要解决它,请在 Swift:

中使用此模式
if let myData = data {
// do something using myData. If data is nil, doen't even enter here
}

完整代码:

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse?, data: NSData?, error: NSError?) -> Void in
    var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil
    if let myData = data {

    let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(myData, options:NSJSONReadingOptions.MutableContainers, error: error) as NSDictionary
    }
})