Ios Swift:额外参数';错误';随时待命

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

我目前正在使用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
的签名已更改,以符合新的错误处理系统

下面是一个如何使用它的示例:

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
在您的第一个示例中适用于我。