目次
環境
- MacOS Catalina バージョン10.15.5
- Xcode11.6
- Swift 5.2.4
Alamofire をインストール
Swift Package Manager でインストールしてみます。
Qiita に iOSアプリ開発にSwift Package Managerを使おう という記事があるので、その通りに進めます。
パッケージのリポジトリのURLは https://github.com/Alamofire/Alamofire を入力します。

一瞬でインストールできました!
一旦適当なJSON APIを叩いて適当にオブジェクトを取得する
以下のような最低限のコードを書くだけでHTTP通信をしてレスポンスを取得できます。
ちなみにAlamofire の クラス名はAFです。
JSON のサンプルとして https://jsonplaceholder.typicode.com/todos/1 のURLを使っています。
AF.request("https://jsonplaceholder.typicode.com/todos/1").response{ response in
guard let data = response.data else {
return
}
let jsonObject = try? JSONSerialization.jsonObject(with: data, options:.allowFragments) as? [String: Any]
print(response.response?.allHeaderFields) // レスポンスヘッダ
print("=====================================")
print(jsonObject) // レスポンスボディ
}
レスポンスヘッダとレスポンスボディがプリントされると思います。
JSONのスキーマを特に予想していないため、JSONSerialization を使ってJSONオブジェクトに変換しています。
Codable を使ってJSONオブジェクトを取得する
シンプルなDicationary型の構造の場合
上記JSONのレスポンスボディは以下です。
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}
それをもとに、Codable に準拠した構造体を作ります。
適当なところに下記を定義します。
struct Todo: Decodable {
var userId: Int
var id: Int
var title: String
var completed: Bool
}
JSONのキーとstruct のプロパティ名、型を一致させます。
プロパティ名は大文字・小文字も厳密にJSONのキー名に一致させます。
(構造体の名前については適当です。
JSONのURLがtodos というパスだったので、適当にTodo という名前にしてます)
以下のようなコードで期待するJSONオブジェクトを取得できます。
AF.request("https://jsonplaceholder.typicode.com/todos/1") { urlRequest in
urlRequest.timeoutInterval = 5
urlRequest.allowsConstrainedNetworkAccess = false
}
.response{ response in
guard let data = response.data else {
return
}
let jsonObject = try? JSONDecoder.init().decode(Todo.self, from: data)
print(jsonObject) // レスポンスボディ
}
レスポンスボディがプリントされたと思います!
定義したJSONのスキーマ採用するので、JSONDecodable を使ってスキーマ に沿ったオブジェクトに変換しています。
JSONDecodable: スキーマを予測できる場合、スキーマ に沿ったオブジェクトを生成する JSONSerialization: スキーマを予測できない場合、とりあえずJSONオブジェクトを生成する
配列型の場合
以下のような配列型の場合
[
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
},
{
"userId": 1,
"id": 2,
"title": "quis ut nam facilis et officia qui",
"completed": false
}
]
以下のように、配列を指定してDecode すれば、オブジェクトの配列に変換できます!
let jsonObject = try? JSONDecoder.init().decode([Todo].self, from: data)
最後に
以上です。お疲れ様でした!