Xcode6, iOS8から、"Embedded Framework" が使えるようになった。
そもそも、"Framework" は "Static Library" と比較して、コードだけではなく、画像やStoryboardなどのリソースも含める事ができるというメリットがあったが、さらに "Embedded Framework" としてプロジェクトに導入することで以下のメリットがあり、その恩恵は非常に価値が高いと思われる。
コード共有
機能を "Framework化" することの最大の目的と利点はなんといってもコレであろう。さらに、"Embedded Framework" はターゲット間でコードを共有する仕組みなので、"Apple Watch" や "Widget" に対応するために "WatchKit Extension" や "Today Extension" をプロジェクトに追加した場合に、機能の共有化が容易にできる。レイヤー分割と依存関係の強制
"Embedded Framework" により機能がレイヤー分割され名前空間も分かれる。また、依存関係を明確にすることができるようになるので、コードが簡潔になる。ビルドパフォーマンスの向上
上記の "レイヤー分割と依存関係の強制" により、Xcodeの差分コンパイルの適応スコープが小さくなり、ビルド時間が短縮される。テストの分割
ターゲット毎にテストが追加されるので、ターゲット単位でテストを記述することができる。
Embedded Framework の導入
Xcodeのツールバー "File" → "New" → "Target"、もしくはプロジェクト "General" から "Add a Target"。
フレームワーク名を入力し、"Finish"。
すると、以下のようにターゲットとフォルダが追加される。(今回は "Purchase" Frameworkを作成)
新しくできたフォルダにFrameworkのコード、およびリソースを追加していく。
購入処理機能を共通化した"Purchase" Frameworkは以下のようになる。(実装は割愛)
"Purchase" Frameworkを使用したい場合は、対象のファイルでimport Purchase
とするだけだ。
Embedded Framework によるレイヤー分割
以下のように、"Model", "Request" をFramework化し、レイヤー分割しておけば、依存関係の整合性を保ちやすく、不適切な参照も起きにくくなる。また、先に述べたように "WatchKit Extension" や "Today Extension" と紐付けることで、Application側と "Model", "Request" を共有することが可能となる。
終わりに
"Embedded Framework" の導入は、簡単かつ有用性が高いので、積極的にプロジェクトに取り入れていきたいと思っている。
本記事を読んでくださったiOSアプリエンジニアの方々にも、是非お試しいただきたい。