我目前正在使用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{


有人可以告诉我我在做什么错吗?

评论

我想这行可能不会出现此错误,因为您可能会进入另一行。

在2.0中,您需要创建一个do catch块。错误不再是NSJSONSerialization的参数。这个问题还有很多其他答案。寻找工作,赶上Swift 2.0

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