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)") }