Swift: дополнительный аргумент "ошибка" в вызове
В настоящее время я разрабатываю свое первое приложение для 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{
Может кто-нибудь, пожалуйста, скажите мне, что я здесь делаю неправильно?
Ответы
Ответ 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 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)
}
Ответ 2
Изменения в Swift 2 изменились, методы, принявшие параметр error
, были преобразованы в методы, которые генерируют эту ошибку вместо того, чтобы возвращать ее с помощью параметра inout
. Посмотрев документацию Apple:
ОБРАЩЕНИЕ ОШИБКИ В SWIFT: В Swift этот метод возвращает неоптический результат и помечен ключевым словом throw, чтобы указать, что он выдает ошибку в случаях сбоя.
Вы вызываете этот метод в выражении try и обрабатываете любые ошибки в предложениях catch инструкции do, как описано в разделе Обработка ошибок на языке Swift Programming (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)") }