ios - Swift: argumento adicional ''error'' en la llamada
swift2 xcode7-beta2 (3)
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
de
NSJSONSerialization
ha cambiado para ajustarse al nuevo sistema de manejo de errores.
Aquí hay un ejemplo de cómo usarlo:
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
de
NSJSONSerialization
y sus métodos han cambiado, de acuerdo con
las Pautas 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)
}
Esto se ha cambiado en 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)") }
Las cosas han cambiado en Swift 2, los métodos que aceptaron un parámetro de
error
se transformaron en métodos que arrojan ese error en lugar de devolverlo a través de un parámetro
inout
.
Al mirar 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 caso de falla.
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 usar
try?
que 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 usar un
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)")
}