Swift: argumento adicional ‘error’ en la llamada

Actualmente estoy desarrollando mi primera aplicación iOS con 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{ 

¿Puede alguien decirme qué estoy haciendo mal aquí?

    Con Swift 2 , la firma para NSJSONSerialization ha cambiado, para cumplir con el 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 Swift API .

    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 aceptaron un parámetro de error se transformaron en métodos que lanzan 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 se marca con la palabra clave throws para indicar que arroja un error en los casos de falla.

    Llama a este método en una expresión try y maneja cualquier error en las cláusulas catch de una instrucción do, como se describe en Manejo de errores en The Swift Programming Language (Swift 2.1) y Error Handling en Using Swift with Cocoa and 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)") } 

    Esto ha sido 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)") }