Swift: дополнительный аргумент 'error' в вызове
В настоящее время я занимаюсь разработкой своего первого приложения для iOS с использованием Swift 2.0 и Xcode Beta 2. Оно читает внешний 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{
Может кто-нибудь сказать мне, что я здесь делаю не так?
3 ответа
С 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
и его методы изменились в соответствии с Руководством по проектированию Swift API.
Вот тот же пример:
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, методы, которые приняли error
Параметр был преобразован в методы, которые выдают эту ошибку, а не возвращают ее через inout
параметр. Просматривая документацию Apple:
ОШИБКИ ОБРАБОТКИ В SWIFT: В Swift этот метод возвращает неопциональный результат и помечается ключевым словом throws, чтобы указать, что он выдает ошибку в случае сбоя.
Вы вызываете этот метод в выражении try и обрабатываете любые ошибки в предложениях catch оператора do, как описано в Обработка ошибок в языке программирования Swift (Swift 2.1) и Обработка ошибок при использовании Swift с какао и 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)")
}
Это было изменено в 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)") }