iOSCon 2017
iOSConとは、iOSやSwiftに関わるエンジニアのためのカンファレンスです。今年は3/30, 31の2日間にロンドンで開催されました。参加者は約200人が集まり、27人のスピーカーがそれぞれLT、セッション、ワークショップ形式で発表します。
全ての発表は聞けませんでしたが、発表内容はかなり楽しめました。Swiftの特性を活かしたアーキテクチャの話や、GraphQLという流行りの技術の話など、自分が知らないこともあり非常に勉強になりました。
来年も開催が決定しているようなので、興味がある方はこちらから詳細を確認してください。
発表内容
「Type-safe Web APIs with Protocol Buffers in Swift」というタイトルで発表しました。当日は著名なスピーカーの方達が聞きに来てくれたのもあって、かなり緊張しました。そのせいで固い発表になってしまいましたが、トピック自体がまだ広まっていないこともあり質疑応答が沢山あったので良かったです。今回の目的の一つである、Protocol Buffersの良さを知ってもらうことを達成出来たように思います。
補足
Protocol BuffersとはGoogleが2008年にリリースしたシリアライゼーションフォーマットです。JSON/XMLよりパフォーマンスが良くシンプルに使えるというのが特徴です。
Message typesというモデル定義を作ればコードジェネレータが各言語用にモデルファイルを生成するので、定義が統一されたモデルファイルをクロスプラットフォームで使用できます。
Appleが去年にSwift用のプラグインをオープンソースとして公開しました。Protocol Buffersを使えば、用途に適した型を独自に定義出来るので、型安全に値を扱えてよりSwiftらしく処理を書けます。
Protocol Buffersに興味がある方は、詳しい内容をこちらのスライドでご覧ください。
当日にクライアント・サーバアプリ間でProtocol Buffersを使ったデモを行いました。サーバアプリはKituraを使用したので全てのコードをSwiftで書いています。実際にどのようなコードを書けば良いかはこちらのリポジトリを参考にしてください。
発表内容のビデオも併せて公開されているので、当日の質疑応答なども含めて聞きたい方はこちらをご覧ください。
個人的に気に入っているところ
-
型安全
データ構造に対して型を持たせられるので、型安全に処理を書けるようになります。例えばHTTP通信の際に、JSONだとDictionary
から値を取得する時にAny
型から該当する型にオプショナルバインディングでキャストする必要があります。一方で、Protocol BuffersだとResponseType
を定義して必要な値をプロパティとして持たせられるので、その型にデシアライズさえ出来ればプロパティ経由でアクセスできます。HTTPのステータスコードもenumで定義出来るので、例外処理をswitch構文で書けるのは気持ちが良いです。 -
Swift値のシリアライズ
NSKeyedArchiver
やNSCache
などのNSファミリーはSwiftと相性が良くないと思っています。そういったオブジェクトを使うとSwiftのstructやenumの値を保存出来ない場合があるので、代わりにProtocol BuffersでシリアライズしたData型の値をそのまま保存します。ファイル形式でデバイス上にキャッシュを保存する場合などに手軽に使えるので便利だと思います。 -
クロスプラットフォーム
HTTP通信の処理を実装するときはサーバサイドエンジニアとのコミュニケーションが増えます。しかし、Protocol Buffersを使えばそのコストを最小限に抑えることができます。モデルファイルに定義が全てまとまっているので、リクエストで送るべき情報も、レスポンスで返ってくる情報も、モデルファイルを見れば全部分かります。またProtocol Buffersは後方互換があり不要になった情報を消しても問題なく動作するので、コード量も少なくなり効率良く実装できると思います。
まとめ
既存のプロジェクトに導入するのは難しいですが、社内サービスやサーバサイドSwiftなどから始めるのがちょうど良いです。もちろんProtocol Buffersにも欠点はありますが、個人的にはそれを上回る利点があると思っています。特にProtocol BuffersはSwiftとの相性がかなり良いと思いました。
メルカリでは既に部分的に本番運用をしていて、Protocol Buffersの使用を徐々に拡大する予定です。皆さんも是非Protocol Buffersを使ってみてください。
メルカリではSwiftに興味があるiOSエンジニアを募集中です。