Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Swift4 Codableがすごすぎた件

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away