Ios Swift:额外参数';错误';随时待命
我目前正在使用Swift 2.0和Xcode Beta 2开发我的第一个iOS应用程序。它读取外部JSON并在表视图中生成一个包含数据的列表。然而,我遇到了一个奇怪的小错误,我似乎无法修复:Ios Swift:额外参数';错误';随时待命,ios,swift2,xcode7-beta2,Ios,Swift2,Xcode7 Beta2,我目前正在使用Swift 2.0和Xcode Beta 2开发我的第一个iOS应用程序。它读取外部JSON并在表视图中生成一个包含数据的列表。然而,我遇到了一个奇怪的小错误,我似乎无法修复: Extra argument 'error' in call 以下是我的代码片段: let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in pr
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
的签名已更改,以符合新的错误处理系统
下面是一个如何使用它的示例:
do {
if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary {
print(jsonResult)
}
} catch let error as NSError {
print(error.localizedDescription)
}
据介绍,随着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中,情况发生了变化,接受
错误
参数的方法被转换为抛出该错误的方法,而不是通过inout
参数返回该错误。通过查看:
SWIFT中的错误处理:
在Swift中,此方法返回一个非可选结果,并用throws关键字标记,以指示在失败时抛出错误
您可以在try表达式中调用此方法,并处理do语句的catch子句中的任何错误,如Swift编程语言中的错误处理(Swift 2.1)和结合Cocoa和Objective-C使用Swift时的错误处理(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)") }
这一行没有给出这个错误,我想可能是b您遇到了不同的行。对于2.0,您需要创建一个
do
catch
块<代码>错误不再是NSJSONSerialization
的参数。这个问题还有很多其他的答案。我正在使用Swift 2.2,并尝试了您的第一个版本。它正在正确编译,但它正在悄无声息地消亡,不会命中打印
行中的任何一行。当我删除jsonResult
前面的if
部分并运行时,我可以推断jsonResult被设置为nil
无错误。我确信数据以一个有效的json字符串开始…@jeffery\u\u你的json可能与你所想的不同。试试这个:谢谢,是的,就是这样!将替换为?NSDictionary
与相同?NSArray
在您的第一个示例中适用于我。