似乎无法使用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()
答案 0 :(得分:9)
编译器抛出以下错误:
/Users/Xcode/Desktop/fdsfsdfds/fdsfsdfds/AppDelegate.swift:24:28: 无法使用类型'的参数列表调用'dataTaskWithURL'(NSURL, (_,_,_)抛出 - >空隙)'
在 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
答案 1 :(得分: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
}
答案 2 :(得分: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 {
}
})