web-dev-qa-db-ja.com

Swift 2?でAlamofire.request()。responseJSONの結果値を取得する方法?

Swift 2のAlamofireの新しいバージョンについて質問があります

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

このセクションでは、結果をNSDictionaryにキャストします。しかし、コンパイルしてブレークポイントを置くと、デバッガーはdicoがnilであると言います。 debugDescriptionを使用して結果を出力する場合、nilではなく、期待したものが含まれています。Result変数をキャストするにはどうすればよいですか。

31
Edgar Georgel

受け入れられた答えはうまく機能しますが、Alamofire 3.0.0の導入により、この実装に影響するいくつかの重大な変更があります。
移行ガイド にはさらに説明がありますが、実際のソリューションに関連するものを強調します。

  • 応答
    すべての応答シリアライザー(応答を除く)は、汎用の応答構造体を返します。

  • 応答タイプ
    Result型は、NSDataを保存しないダブルジェネリック型に再設計されました。 _.Failure_の場合

また、応答の内容に関係なく、Alamofireが完了した要求を成功とみなすことも考慮してください。したがって、.validate()の前に.responseJSON()をチェーンして、_.Failure_ケースをヒットする必要があります。詳細については こちら をご覧ください。

更新されたコード:

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

参考のため:

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

SwiftyJSON libraryを使用してもかまわない場合は、Xcode 7 Beta 5 + Alamofire 2.0.0-beta.1 + SwiftyJSON(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)")
    }
}

編集:

SwiftyJSON gitページを更新

38
chemic