我目前正在使用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{
有人可以告诉我这里我做错了吗?
答案 0 :(得分:75)
使用 Swift 2 ,NSJSONSerialization
的签名已更改,以符合新的错误处理系统。
以下是如何使用它的示例:
do {
if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary {
print(jsonResult)
}
} catch let error as NSError {
print(error.localizedDescription)
}
根据the Swift API Design Guidelines,使用 Swift 3 ,NSJSONSerialization
的名称及其方法已发生变化。
以下是相同的例子:
do {
if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? [String:AnyObject] {
print(jsonResult)
}
} catch let error as NSError {
print(error.localizedDescription)
}
答案 1 :(得分:5)
Swift 2中已经发生了变化,接受error
参数的方法被转换为抛出该错误而不是通过inout
参数返回的方法。通过查看Apple documentation:
处理SWIFT中的错误: 在Swift中,此方法返回一个非可选结果,并使用throws关键字标记,以指示在失败的情况下它会引发错误。
在try表达式中调用此方法并处理do语句的catch子句中的任何错误,如Swift编程语言中的错误处理(Swift 2.1)和使用Swift与Cocoa和Objective-C中的错误处理中所述(斯威夫特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)")
}
答案 2 :(得分:0)
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)") }