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

Mik*_*e U 1 xcode7 swift2

似乎无法使用Xcode 7编译以下代码,我收到错误"无法使用类型的参数列表调用'dataTaskWithURL'

看起来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()
Run Code Online (Sandbox Code Playgroud)

Tom*_*min 9

编译器抛出以下错误:

/Users/Xcode/Desktop/fdsfsdfds/fdsfsdfds/AppDelegate.swift:24:28:无法使用类型'(NSURL,(_,_,_)throws - > Void)的参数列表调用'dataTaskWithURL '

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

(NSData?, NSURLResponse?, NSError?) throws -> Void
Run Code Online (Sandbox Code Playgroud)

这与实际的completionHandler dataTaskWithURL期望的错误相匹配.

要解决此问题,只需将您的调用包装NSJSONSerialization.JSONObjectWithData为do/catch语句,如下所示即可处理错误:

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

} catch {
    // handle error
}
Run Code Online (Sandbox Code Playgroud)

有关Swift2中有关错误处理的更多信息,请参阅此处提供的预发布文档