web-dev-qa-db-fra.com

Swift: L'argument supplémentaire 'erreur' dans l'appel

Je développe actuellement ma première application iOS avec Swift 2.0 et Xcode Beta 2. Elle lit un JSON externe et génère une liste dans une vue sous forme de tableau avec les données. Cependant, je reçois une petite erreur étrange que je n'arrive pas à corriger: 

Extra argument 'error' in call

Voici un extrait de mon code:

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

L'erreur est renvoyée à cette ligne:

if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary{

Est ce que quelqu'un peut me dire ce que je fais mal ici?

47
kaanmijo

Avec Swift 2, la signature de NSJSONSerialization a été modifiée pour se conformer au nouveau système de traitement des erreurs.

Voici un exemple d'utilisation:

do {
    if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary {
        print(jsonResult)
    }
} catch let error as NSError {
    print(error.localizedDescription)
}

Avec Swift 3, le nom de NSJSONSerialization et ses méthodes ont changé, conformément à les directives de conception des API Swift .

Voici le même exemple:

do {
    if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? [String:AnyObject] {
        print(jsonResult)
    }
} catch let error as NSError {
    print(error.localizedDescription)
}
75
ayaio

Les choses ont changé dans Swift 2, les méthodes acceptant un paramètre error ont été transformées en méthodes renvoyant cette erreur au lieu de la renvoyer via un paramètre inout. En regardant la documentation Apple :

GESTION DES ERREURS DANS Swift: Dans Swift, cette méthode retourne un résultat non-optionnel et est marquée avec le mot clé throws pour indiquer qu'elle génère une erreur en cas d'échec.

Vous appelez cette méthode dans une expression try et gérez les erreurs dans les clauses catch d'une instruction do, comme décrit dans Gestion des erreurs dans Swift Programming Language (Swift 2.1) et Gestion des erreurs dans l'utilisation de Swift avec Cocoa et Objective-C (Swift 2.1 ).

La solution la plus courte serait d’utiliser try? qui renvoie nil en cas d’erreur:

let message = try? NSJSONSerialization.JSONObjectWithData(receivedData, options:.AllowFragments)
if let dict = message as? NSDictionary {
    // ... process the data
}

Si l'erreur vous intéresse également, vous pouvez utiliser 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)")
}
5
Cristik

Cela a été changé dans 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)") }
0
CodeSteger