はじめに
こちらは Swift その2 Advent Calendar 2017 の3日目の記事です。
今年の後半戦から久々に業務にてiOSアプリを開発することが決まっていたため、実に1年半ぶりにSwiftを扱うことになりました。
Swift4を積極的に利用していた際に、便利と名高い Codable
に触れる機会があったため、
本記事では実際に使ってみた Codable
の例を書きたいと思います。
Codableとは
これまで JSON
をパースするためには、
JSONSerialization
や SwiftyJSON
などのOSSライブラリを利用して値を取り出す形で書いていたことと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
上記のように、 SwiftyJSON
を利用して JSON
化したオブジェクトから、
let id = json["id"].string
や let name = json["name"].string
のように返却レスポンスである Restaurant
に自身でマッピングする必要がありました。
これがなんと、 Codable
を利用することで、毎回のように書いていたマッピング処理が簡素化されるようです。
実際の利用例
今回はFacebookログインによる認証処理が機能の1つとして必要でした。
また、Facebookの Graph API
を叩いて幾つかのプロフィール情報を取得するのですが、
その中で gender
の項目のみ「Facebookが返却する値」と「こちらのシステムが担保する gender
の値」が異なっていました。
形式の違いは以下の通りです。
まずは、Facebookが返却するgenderの値です。
1 2 |
|
続いて必要だった形式です。
1 2 |
|
もちろん上記違いがあったとしても Codable
は利用可能ですので、実際に書いてみました。
※ Facebookログインを利用するための前準備は SwiftでFacebookログインを始めよう! を参考にしてください。
システム固有の性別のEnumの定義
1 2 3 4 5 |
|
Codableに準拠する構造体の定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
JSONDecoderの拡張定義
少々困ったのが、Facebookの Graph API
から返却される response
を data
型に変換するメソッドが予め用意されていないことでした。
毎回、 JSONSerialization
を利用する処理を1行加えるのも手間なので、以下のように拡張メソッドを用意することにしました。
1 2 3 4 5 6 7 8 9 10 |
|
Facebook Graph APIによるプロフィール情報取得処理
準備は整ったので、実際に Graph API
を叩く部分の処理を実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
|
上記の通り、 let profile = try decoder.decode(...)
だけで済んでいますね。
今回は1つのメソッドしか書いていませんが同様のレスポンスを持つ複数メソッドを定義する必要がある場合などにより効力を発揮しそうな気がします。
まとめ
さて如何でしたでしょうか?
Codable
は今後更なる進化も予定されていると聞きますし、楽しみな機能の1つですね。
筆者も引き続き積極的にSwift4の機能を利用していきたいと思います。
最後にソースコード全体を載せておきます。
(説明上、関係のないところは割愛していたので…)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
|
といったところで本日はここまで。