web-dev-qa-db-fra.com

Comment obtenir la valeur de résultat de Alamofire.request (). ResponseJSON dans Swift 2?

J'ai une question sur la nouvelle version d'Alamofire pour Swift 2

Alamofire.request(.POST, urlString, parameters: parameters as? [String : AnyObject])
        .responseJSON { (request, response, result) -> Void in
            let dico = result as? NSDictionary
            for (index, value) in dico! {
                print("index : \(index)     value : \(value)")
            }
    }

Dans cette section, j'aimerais attribuer le résultat à un NSDictionary. Mais quand je compile et mets un point d'arrêt, le débogueur dit que dico est nil. Si j'utilise debugDescription pour imprimer le résultat, il n'est pas nul et contient ce à quoi je m'attendais. Comment puis-je convertir la variable Result?

31
Edgar Georgel

La réponse acceptée fonctionne très bien, mais avec l’introduction d’Alamofire 3.0.0, certains changements décisifs ont une incidence sur cette implémentation.
Le guide de migration a d'autres explications, mais je vais souligner celles qui sont liées à la solution actuelle.

  • Réponse
    Tous les sérialiseurs de réponse (à l'exception de response) renvoient une structure de réponse générique.

  • Type de réponse
    Le type de résultat a été modifié pour devenir un type double générique qui ne stocke pas le NSData? dans le cas .Failure.

De plus, tenez compte du fait qu’Alamofire considère que toute demande complétée est considérée comme réussie, quel que soit le contenu de la réponse. Vous devez donc chaîner une .validate() avant .responseJSON() pour toucher le cas .Failure. En savoir plus à ce sujet ici .

Code mis à jour:

let url = "http://api.myawesomeapp.com"
Alamofire.request(.GET, url).validate().responseJSON { response in
    switch response.result {
    case .Success(let data):
        let json = JSON(data)
        let name = json["name"].stringValue
        print(name)
    case .Failure(let error):
        print("Request failed with error: \(error)")
    }
}

Pour référence:

  • Xcode 7.3 (Swift 2.2)
  • Alamofire 3.3.1
  • SwiftyJSON 2.3.3
56
Javier Cadiz

Si cela ne vous dérange pas d'utiliser la bibliothèque SwiftyJSON , voici un exemple de travail dans Xcode 7 Beta 5 + Alamofire 2.0.0-beta.1 + SwiftyJSON (branche xcode7)

Alamofire.request(.GET, url, parameters: params, encoding: ParameterEncoding.URL).responseJSON { (_, _, result) in
    switch result {
        case .Success(let data):
            let json = JSON(data)
            let name = json["name"].string
        case .Failure(_, let error):
            print("Request failed with error: \(error)")
    }
}

Modifier:

Mis à jour SwiftyJSON git page

38
chemic