47

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

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

4

3 回答 3

75

Swift 2中,for的签名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)
}
于 2015-06-26T12:58:04.437 回答
5

在 Swift 2 中情况发生了变化,接受error参数的方法被转换为抛出错误的方法,而不是通过inout参数返回错误。通过查看Apple 文档

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

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

如果发生错误,最短的解决方案是使用try?which 返回: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)")
}
于 2016-01-10T10:11:22.667 回答
0

这在 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)") }
于 2016-09-29T09:44:46.047 回答