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{
有人可以告诉我我在做什么错吗?
#1 楼
在Swift 2中,NSJSONSerialization
的签名已更改,以符合新的错误处理系统。这里是如何使用它的示例:do {
if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary {
print(jsonResult)
}
} catch let error as NSError {
print(error.localizedDescription)
}
根据Swift API设计指南,使用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)
}
评论
我正在使用swift 2.2,并尝试了您的第一个版本。它可以正确编译,但是却死于无声,没有碰到任何打印行。当我删除jsonResult前面的if部分并运行时,我可以推断jsonResult被设置为nil,没有错误。我确定数据以有效的json字符串开头...
–jeffery_the_wind
16 Jun 25'7:03
@jeffery_the_wind您的JSON可能与您的想法不同。试试这个:stackoverflow.com/a/33510776/2227743
–埃里克·艾亚(Eric Aya)
16年6月25日在9:37
谢谢,是的!替换为? NSDictionary与as?第一个示例中的NSArray对我有用。
–jeffery_the_wind
16年6月26日在12:50
#2 楼
在Swift 2中,情况发生了变化,接受error
参数的方法被转换为引发该错误而不是通过inout
参数返回错误的方法。通过查看Apple文档:处理SWIFT中的错误:
在Swift中,此方法返回非可选结果,并用throws关键字标记以表明它抛出了故障时出错。
您可以在try表达式中调用此方法,并处理do语句的catch子句中的任何错误,如Swift编程语言(Swift 2.1)中的错误处理中所述和将Swift与Cocoa和Objective-C(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)")
}
#3 楼
在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)") }
评论
我想这行可能不会出现此错误,因为您可能会进入另一行。在2.0中,您需要创建一个do catch块。错误不再是NSJSONSerialization的参数。这个问题还有很多其他答案。寻找工作,赶上Swift 2.0