Swift:调用中的额外参数'错误'

kaa*_*ijo 47 ios swift2 xcode7-beta2

我目前正在使用Swift 2.0和Xcode Beta 2开发我的第一个iOS应用程序.它读取外部JSON并在数据表格视图中生成列表.但是,我得到一个奇怪的小错误,我似乎无法修复:

Extra argument 'error' in call
Run Code Online (Sandbox Code Playgroud)

这是我的代码片段:

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()
                    })
                }
            }
        })
Run Code Online (Sandbox Code Playgroud)

此行引发错误:

if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary{
Run Code Online (Sandbox Code Playgroud)

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

aya*_*aio 75

随着斯威夫特2,该签名NSJSONSerialization改变,以符合新的错误处理系统.

以下是如何使用它的示例:

do {
    if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary {
        print(jsonResult)
    }
} catch let error as NSError {
    print(error.localizedDescription)
}
Run Code Online (Sandbox Code Playgroud)

随着斯威夫特3,该名称NSJSONSerialization和它的方法已根据改变,雨燕API设计指南.

这是相同的例子:

do {
    if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? [String:AnyObject] {
        print(jsonResult)
    }
} catch let error as NSError {
    print(error.localizedDescription)
}
Run Code Online (Sandbox Code Playgroud)


Cri*_*tik 5

在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
}
Run Code Online (Sandbox Code Playgroud)

如果您对错误感兴趣,可以使用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)")
}
Run Code Online (Sandbox Code Playgroud)