工夫ひとつで更に強力に 「Codableが導く型安全な世界」 #tryswiftconf

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

モバイルアプリサービス部の中安です。

昨日に引き続き try!swift のセッションのレポートを書かせていただきます。

講演概要

公式ページからの引用

Codableが導く型安全な世界 by Tatsuya Tanaka

CodableはAPIのレスポンスをマッピングするためだけの機能ではありません。Codableは様々な場面で利用でき、ソースコードを型安全にすることができます。このLTではCodableをフル活用するためのアプローチや、よりアグレッシブなCodableの活用方法をご紹介します。

スライド資料

内容

Codableについての発表は、今回では2つめです。それほどCodableはSwiftの強力な機能といっていいでしょう。 自分もCodableの応用を他の人がどのようにしているのか気になっていましたので、このライトニングトークは楽しみにしていました。

発表の基本路線は「Codableは単なるJSONのマッピング機能ではなく、コードをより美しく、より型安全にしてくれるものだ」という話でした。

DataConvertible

普通にJSONをCodableを使ってエンコード/デコードをする際は下記のようなやり方です、と。 確かに自分のブログでもこのスタンダードな方法を紹介してました。

しかし、登壇者はそうではなく、新たなプロトコルを用意することをお勧めされました。下記のようなものです。

すると、JSONという存在は隠蔽され、Dataのみでのやりとりとなります。

たしかにこれで「何に変換するのか/何から変換されるのか」の意識はなくなります。ちょっとした工夫ですけど、おもしろい。

この仕組を用いることで、UserDefaultsにクラスや構造体をそのままストアドさせてやることも容易にできるとのこと。いいですね!

カスタムなデコーダ/エンコーダ

今現在は、Codableのデコーダ/エンコーダとして標準で用意されているのは、JSONとプロパティリスト(plist)のみが用意されています。 これから増えていくかもしれませんが、たしかに登壇者の言うとおりこれだとデータをマップする用途が大半になるかもですね。

そこで登壇者は、カスタムなデコーダ/エンコーダを作るということに取り組んだそうです。

  • Dictionaryにエンコード/Dictionaryからデコードする
  • URLのGETパラメータにエンコード/URLのGETパラメータからデコードする

めっちゃどうやって作ったのかが気になるところでしたが「ソースが長すぎてライトニングトークでは無理」の言葉に会場が笑いに包まれました。

でもご安心。登壇者のGitHubには公開されているそうなので、気になる人はそちらをチェック。(自分は気になる人なのでチェックします)

https://github.com/tattn/MoreCodable

感想

やはり期待してたとおり、Codableの新しい使い方をしれてよかったです。ちょっとした工夫でCodableはさらに便利にできそう。そして、Swift自体のCodableがさらに進化していくことを期待したいと思います。