Edited at

Swift4 Codableがすごすぎた件

More than 1 year has passed since last update.

Swift4から新たにFoundationに追加されたCodableプロトコルがすごすぎたのでご紹介。

API通信でデータを取得する際に、JSONで受け取ってモデルや構造体に変換する、といった手法が一般的である。これまでは、JSONSerializationやライブラリを用いてパースし、プロパティにセットする、ということをしていたと思う。Swift4からは、Codableを用いることで、シンプルにコレを実現することが可能となったのだ!


Codable

以下のようなJSONをAPI通信のレスポンスで取得するとしよう。

{

"name": "hoge",
"sex": 0,
"birthday": "19900530",
"mail_address": "hoge@gmail.com"
}

コレを"User"構造体に変換する場合は以下のようになる。


User.swift

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"
}
]
}

コイツを以下のような構造体に変換する。


UserListResult.swift

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"!!


UserListResult.swift

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を導入すればきっとあなたは幸せになれるハズである。