Swift:在调用中额外的参数“错误”

我目前正在使用Swift 2.0和Xcode Beta 2开发我的第一个iOS应用程序。它读取一个外部JSON,并在数据的表视图中生成一个列表。 但是,我得到一个奇怪的小错误,我似乎无法解决:

Extra argument 'error' in call 

这是我的代码片段:

 let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in print("Task completed") if(error != nil){ print(error!.localizedDescription) } var err: NSError? if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary{ if(err != nil){ print("JSON Error \(err!.localizedDescription)") } if let results: NSArray = jsonResult["results"] as? NSArray{ dispatch_async(dispatch_get_main_queue(), { self.tableData = results self.appsTableView!.reloadData() }) } } }) 

错误是在这一行:

 if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary{ 

有人可以告诉我,我在这里做错了吗?

Swift 2中NSJSONSerialization签名已经改变,以符合新的error handling系统。

这是一个如何使用它的例子:

 do { if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary { print(jsonResult) } } catch let error as NSError { print(error.localizedDescription) } 

使用Swift 3 ,根据Swift APIdevise指南 , NSJSONSerialization名称及其方法已经改变。

这里是相同的例子:

 do { if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? [String:AnyObject] { print(jsonResult) } } catch let error as NSError { print(error.localizedDescription) } 

在Swift 2中,事情已经发生了变化,接受error参数的方法被转换成引发错误的方法,而不是通过inout参数返回。 通过查看Apple文档 :

在SWIFT中处理错误:在Swift中,这个方法返回一个非可选的结果,并用throws关键字标记,表示在失败的情况下抛出一个错误。

在try语句中调用此方法,并处理do语句的catch子句中的任何错误,如Swift编程语言(Swift 2.1)中的error handling和使用Swift与Cocoa和Objective-C中的error handling(Swift 2.1 )。

最短的解决办法是使用try? 如果发生错误,则返回nil

 let message = try? NSJSONSerialization.JSONObjectWithData(receivedData, options:.AllowFragments) if let dict = message as? NSDictionary { // ... process the data } 

如果你也对这个错误感兴趣,你可以使用do/catch

 do { let message = try NSJSONSerialization.JSONObjectWithData(receivedData, options:.AllowFragments) if let dict = message as? NSDictionary { // ... process the data } } catch let error as NSError { print("An error occurred: \(error)") } 

这已经在Swift 3.0中改变了。

  do{ if let responseObj = try JSONSerialization.jsonObject(with: results, options: .allowFragments) as? NSDictionary{ if JSONSerialization.isValidJSONObject(responseObj){ //Do your stuff here } else{ //Handle error } } else{ //Do your stuff here } } catch let error as NSError { print("An error occurred: \(error)") }