Swift4から新たにFoundationに追加されたCodableプロトコルがすごすぎたのでご紹介。
API通信でデータを取得する際に、JSONで受け取ってモデルや構造体に変換する、といった手法が一般的である。これまでは、JSONSerializationやライブラリを用いてパースし、プロパティにセットする、ということをしていたと思う。Swift4からは、Codableを用いることで、シンプルにコレを実現することが可能となったのだ!
Codable
以下のようなJSONをAPI通信のレスポンスで取得するとしよう。
{
"name": "hoge",
"sex": 0,
"birthday": "19900530",
"mail_address": "hoge@gmail.com"
}
コレを"User"構造体に変換する場合は以下のようになる。
import Foundation
struct User: Codable {
let name: String
let sex: Int
let birthday: String
let mail_address: String
}
変換する処理は一撃だ!
let jsonString = さんぷるのじぇいそん
let user = try! JSONDecoder().decode(User.self, from: jsonString.data(using: .utf8)!)
以上、終了である。
ネストにも対応
ネストされたデータはどうだろうか。
以下のようなJSONのケースを考えてみる。
{
"status_code": 200,
"user_list": [
{
"name": "hoge",
"sex": 0,
"birthday": "19900530",
"mail_address": "hoge@gmail.com"
},
{
"name": "fuga",
"sex": 1,
"birthday": "19850421",
"mail_address": "fuga@gmail.com"
}
]
}
コイツを以下のような構造体に変換する。
import Foundation
struct UserListResult: Codable {
let status_code: Int
let user_list: [User]
}
お前は既に死んでいる
let jsonString = さんぷるのじぇいそん
let userListResult = try! JSONDecoder().decode(UserListResult.self, from: jsonString.data(using: .utf8)!)
ひでぶ!!
スネークケースはちょっと…。
サーバーサイドではスネークケース、クライアントサイドではキャメルケースを採用している場合など、JSONのキーと構造体のプロパティ名が意図しているものと異なることがある。でもご安心を、そんなあなたに"CodingKey"!!
import Foundation
struct UserListResult: Codable {
let statusCode: Int
let userList: [User]
private enum CodingKeys: String, CodingKey {
case statsCode = "status_code"
case userList = "user_list"
}
}
コレでプロパティ名とフィールド名をマッピング定義させることができた。Coooooooool!!!!!!
終わりに
iOSアプリ開発には必ずつきまとうであろうAPI通信のレスポンス処理、Codableを導入すればきっとあなたは幸せになれるハズである。