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 が指示する通りにやっておけばそのうち理解できると思います。
コメントを残す