ios swift2 xcode7-beta2

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)") }