Swift: Argumento adicional 'error' en la llamada

Resuelto kaanmijo asked hace 54 años • 3 respuestas

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í?

kaanmijo avatar Jan 01 '70 08:01 kaanmijo
Aceptado

Con Swift 2 , la firma ha NSJSONSerializationcambiado 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 NSJSONSerializationmé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)
}
Eric Aya avatar Jun 26 '2015 12:06 Eric Aya

Las cosas han cambiado en Swift 2, los métodos que aceptaban un errorparámetro se transformaron en métodos que arrojan ese error en lugar de devolverlo mediante un inoutpará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 nilsi 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)")
}
Cristik avatar Jan 10 '2016 10:01 Cristik