Swift: Argumento adicional 'error' en la llamada
Actualmente estoy desarrollando mi primera aplicación para iOS usando Swift 2.0 y Xcode Beta 2. Lee un JSON externo y genera una lista en una vista de tabla con los datos. Sin embargo, recibo un pequeño error extraño que parece que no puedo solucionar:
Extra argument 'error' in call
Aquí hay un fragmento de mi código:
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()
})
}
}
})
El error se produce en esta línea:
if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary{
¿Alguien puede decirme qué estoy haciendo mal aquí?
Con Swift 2 , la firma ha NSJSONSerialization
cambiado para adaptarse al nuevo sistema de manejo de errores.
A continuación se muestra un ejemplo de cómo utilizarlo:
do {
if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary {
print(jsonResult)
}
} catch let error as NSError {
print(error.localizedDescription)
}
Con Swift 3 , el nombre y sus NSJSONSerialization
métodos han cambiado, según las Directrices de diseño de API de Swift .
Aquí está el mismo ejemplo:
do {
if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? [String:AnyObject] {
print(jsonResult)
}
} catch let error as NSError {
print(error.localizedDescription)
}
Las cosas han cambiado en Swift 2, los métodos que aceptaban un error
parámetro se transformaron en métodos que arrojan ese error en lugar de devolverlo mediante un inout
parámetro. Mirando la documentación de Apple :
MANEJO DE ERRORES EN SWIFT: En Swift, este método devuelve un resultado no opcional y está marcado con la palabra clave throws para indicar que arroja un error en casos de falla.
Usted llama a este método en una expresión try y maneja cualquier error en las cláusulas catch de una declaración do, como se describe en Manejo de errores en el lenguaje de programación Swift (Swift 2.1) y Manejo de errores al usar Swift con Cocoa y Objective-C (Swift 2.1). ).
La solución más corta sería utilizar try?
which devuelve nil
si se produce un error:
let message = try? NSJSONSerialization.JSONObjectWithData(receivedData, options:.AllowFragments)
if let dict = message as? NSDictionary {
// ... process the data
}
Si también está interesado en el error, puede utilizar 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)")
}