1

似乎无法使用 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()
4

3 回答 3

9

编译器抛出以下错误:

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

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

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

这与预期的实际完成 处理程序不匹配,因此错误。dataTaskWithURL

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

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

} catch {
    // handle error
}

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

于 2015-06-16T11:04:59.790 回答
2

从 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
    }
于 2015-09-02T12:19:50.390 回答
1
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 {

            }

        })
于 2015-10-20T05:18:24.500 回答