F.Ko-Jiの「一秒後は未来」

SwiftでAFNetworkingを使う

Swift と Objective-C のコードはファイル単位で共存できるので、AFNetworking のような便利な CocoaPods のライブラリも Swift 内で使用できます。

まず CocoaPods は利用可能な状態になっているとして、 AFNetworking.h を *-Briding-Header.h ファイル内でインポートします。

#import <AFNetworking.h>

詳しくは Using Swift with Cocoa and Objective-C: Swift and Objective-C in the Same Project にある通り。 briding header ファイルは Swift プロジェクトに Objective-C ファイルを初めて追加する際に自動的に作成することもできるので、適当に Objective-C のファイルをプロジェクトに追加するといいです。

これでプロジェクト内の Swift コードのどこからでも AFNetworking が使えるようになります。

let manager: AFHTTPRequestOperationManager = AFHTTPRequestOperationManager()

let url = "http://www.example.com/api"

// Dictionary でも NSDictionary でもよい
let params = ["start": 0, "count": 10]

manager.GET(url, parameters: params, success: {
    (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in
        // レスポンスを処理
}, failure: {
    (operation: AFHTTPRequestOperation!, error: NSError!) in
        // エラー処理
})

ブロック内の引数の型宣言はなくても構わないので、例えば success のブロックは以下のようにも書けます。

manager.GET(url, parameters: params, success: {
    (operation, responseObject) in
        // レスポンスを処理
}, failure: {

responseObject は Dictionary もしくは NSDictionary にして処理するとよさそうです。ただ Dictionary の場合は要素の型まで指定する必要があるので [String: AnyObject] とするのが無難。それから各要素の値を取得する際にも明示的にキャストする必要があります。

manager.GET(url, parameters: params, success: {
    (operation, responseObject) in
        let response = responseObject as? NSDictionary

        // もしくは
        // let response = responseObject as? [String: AnyObject]

        // 要素を取得する際には明示的にキャスト
        let name = response!["name"] as String
}, filure: {

Optional の関係で ? や ! が必要だったり必要でなかったりしてややこしいですが、 Xcode が指示する通りにやっておけばそのうち理解できると思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など