Xcode
iOS
swift4
Codable

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