ios-Swift:额外的参数“错误”在

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

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

kaanmijo asked 2020-02-23T02:25:30Z
3个解决方案
75 votes

在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)
}
ayaio answered 2020-02-23T02:25:58Z
5 votes

在Swift 2中,情况发生了变化,接受do/catch参数的方法被转换为引发该错误而不是通过nil参数返回错误的方法。 通过查看Apple文档:

SWIFT中的处理错误:   在Swift中,此方法返回非可选结果,并用throws关键字标记以指示在失败的情况下抛出错误。

您可以在try表达式中调用此方法,并处理do语句的catch子句中的所有错误,如Swift编程语言(Swift 2.1语言)中的错误处理和结合使用Swift与Cocoa和Objective-C(Swift 2.1)中的错误处理中所述 )。

最短的解决方案是使用do/catch,如果发生错误,则返回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)")
}
Cristik answered 2020-02-23T02:26:37Z
0 votes

在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)") }
CodeSteger answered 2020-02-23T02:26:56Z
translate from https://stackoverflow.com:/questions/31073497/swift-extra-argument-error-in-call