16848


現在，[No.1スクール講師陣による
世界一受けたいiPhoneアプリ開発の授業](http://gihyo.jp/book/2015/978-4-7741-7295-8)という書籍で，Swiftを学習しているのですが，Xcodeのバージョンアップに伴い，Swift2.0に書き直してみようと思いましたが，解決が難しい箇所に直面しましたので，こちらで質問させていただきました．本来なら本家のサポートサイトの更新もしくは，Swift2.0対応版を待つべきところかと思いますが，ご回答いただけますと幸いです．

エラーが出ているファイル：  
[サポートサイト](http://gihyo.jp/book/2015/978-4-7741-7295-8/support)からダウンロードしたファイル（Xcode
6.3+iOS8.3対応）->Chapter8->完成例->NewsReader->NewsReader->ViewController.swift  
上記のファイルを「Latest Swift Syntax」にConvertしています．また，Alamofireは最新版をダウンロードし，追加しています．

エラー部分（override func viewDidLoad()内，35行目付近）：

[code]

    Alamofire.request(.GET,requestUrl).responseJSON {(request, response, json, error) in
        let jsonDic = json as! NSDictionary
        let responseData = jsonDic["responseData"] as! NSDictionary
        self.newsDataArray = responseData["results"] as! NSArray
        self.table.reloadData()
    }
    
[/code]

上記の，

[code]

    Alamofire.request(.GET,requestUrl).responseJSON {(request, response, json, error) in
    
[/code]

という部分に

[code]

    '(_, _, _, _) -> Void' is not convertible to 'Response<AnyObject, NSError> -> Void'
    
[/code]

というエラーが表示されている状態です．

よろしくお願いいたします．


CC BY-SA 3.0
2015-09-22T08:52:13.430
16844
2015-10-16T16:15:17.597
2015-10-16T16:15:17.597
5519
12401
question
ios swift alamofire
Alamofire 3.0を使用してJSONデータを取得する方法


Swift2.0版AlamofireのresponseJSONは[クロージャの引数が public struct
Responseになっているため](https://github.com/easyui/Alamofire/blob/1108ae4461baa99d9c4898c213ec3e2e2956fab3/Source/ResponseSerialization.swift#L267-L269)、以前の記述であった

[code]

    (request, response, json, error) in
    
[/code]

を

[code]

    response in
    
[/code]

のようにすれば良いです。ただし、このresponseは先述したように型が 'public struct Response' であり
'NSHTTPURLResponse'ではありませんので、手っ取り早く結果だけ欲しいのであれば次のようにResponseのresult.valueを使います。

[code]

    Alamofire.request(.GET,requestUrl).responseJSON { response in
        if let jsonDic = response.result.value as? NSDictionary {
            let responseData = jsonDic["responseData"] as! NSDictionary
            self.newsDataArray = responseData["results"] as! NSArray
            self.table.reloadData()
        }
    }
    
[/code]

また、通信が成功したか失敗したかを判定し、エラーハンドリングしたいなどの場合は次のようにresultで判定するのが良いかもしれません。

[code]

    Alamofire.request(.GET,requestUrl).responseJSON { response in
        switch response.result {
        case .Success(let value):
            if let jsonDic = value as? NSDictionary {
                let responseData = jsonDic["responseData"] as! NSDictionary
                self.newsDataArray = responseData["results"] as! NSArray
                self.table.reloadData()                    
            }
        case .Failure(let error):
            // 通信のエラーハンドリングしたいなら
            print(error)
        }
    }
    
[/code]


CC BY-SA 3.0
2015-09-22T11:29:36.960
16847
2015-09-22T11:29:36.960
7374
16844
answer


これはAlamofireのAPI変更が原因です。

`responseJSON`の`completionHandler`のクロージャの型が`Response<AnyObject, NSError> ->
Void`（いわゆるEither的なもの）に変更されました。

元のソースコードが特に異常系について考慮していないので、その前提で同様のコードを記述すると以下の通りです。

[code]

    Alamofire.request(.GET, requestUrl).responseJSON {
        response in
        if response.result.isSuccess {
            //まずJSONデータをNSDictionary型に
            let jsonDic = response.result.value as! NSDictionary
            //辞書化したjsonDicからキー値"responseData"を取り出す
            let responseData = jsonDic["responseData"] as! NSDictionary
            //responseDataからキー値"results"を取り出す
            self.newsDataArray = responseData["results"] as! NSArray
            //ニュース記事を取得したらテーブルビューに表示
            self.table.reloadData()
        }            
    }
    
[/code]


CC BY-SA 3.0
2015-09-22T11:29:54.330
16848
2015-09-22T11:29:54.330
5337
16844
answer