Swift 2 NSURLSession.sharedSession().dataTaskWithURL 无法使用类型的参数列表调用

Swift 2 NSURLSession.sharedSession().dataTaskWithURL Cannot invoke with an argument list of type

似乎无法使用 Xcode 7 编译以下代码,我收到错误 "Cannot invoke 'dataTaskWithURL' with an argument list of type"

看起来 completionHandler 不再是可选的,无法弄清楚如何重写以下代码。感谢任何帮助,谢谢

    let session = NSURLSession.sharedSession()
    let url = NSURL(string: urlString)

    var task = session.dataTaskWithURL(url!) {
        (data, response, error) -> Void in

        if error != nil {
            print(error!.localizedDescription)
        }
        else {
            var error: NSError?

            var jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
            // Do Stuff
        }
    }

    task!.resume()

编译器抛出以下错误:

/Users/Xcode/Desktop/fdsfsdfds/fdsfsdfds/AppDelegate.swift:24:28: Cannot invoke 'dataTaskWithURL' with an argument list of type '(NSURL, (_, _, _) throws -> Void)'

completionHandler 中,您没有捕捉到 JSONObjectWithData 最终可能抛出的异常。因此,编译器推断您正在尝试传播要求 completionHandler 具有以下签名的异常:

(NSData?, NSURLResponse?, NSError?) throws -> Void

这与 completionHandler dataTaskWithURL 预期的实际不匹配,因此出现错误。

要解决此问题,只需将对 NSJSONSerialization.JSONObjectWithData 的调用包装成一个 do/catch 语句,如下所示来处理错误:

do {
    var jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
    // Do Stuff

} catch {
    // handle error
}

有关 Swift2 中错误处理的更多信息,请参阅可用的预发布文档 here

从 Swift 2.0 (Xcode 7 beta 6) 开始,像这样使用 dataTaskWithURL()

var task = session.dataTaskWithURL(url!, completionHandler: {
   (data, response, error) -> Void in

   :
})
task.resume()

要在完成处理程序中使用 NSJSONSerialization.JSONObjectWithData,您还需要捕获错误:

    do {
        var jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
        // Do Stuff
    } catch {
        // handle error
    }
let url : String = String(format: "http://api.nytimes.com/svc/news/v3/content/nyt/all/720.json?api-key=%@",apiKey)
        let url1: NSURL = NSURL(string: url)!
      let session = NSURLSession.sharedSession()
        let task1 = session.dataTaskWithURL(url1, completionHandler: {
            (data, response, error) -> Void in
                        do {
                         if data == nil {
                    return
                }
                else
                {

                let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSDictionary
                self.dict = jsonData;
                self.array1 = (self.dict.objectForKey("results") as? NSMutableArray)!
                dispatch_async(dispatch_get_main_queue()) {
                    self.table.reloadData()
                }

                }

            } catch {

            }

        })