13
8

More than 5 years have passed since last update.

Xcode6, iOS8から、"Embedded Framework" が使えるようになった。

そもそも、"Framework" は "Static Library" と比較して、コードだけではなく、画像やStoryboardなどのリソースも含める事ができるというメリットがあったが、さらに "Embedded Framework" としてプロジェクトに導入することで以下のメリットがあり、その恩恵は非常に価値が高いと思われる。

  1. コード共有
    機能を "Framework化" することの最大の目的と利点はなんといってもコレであろう。さらに、"Embedded Framework" はターゲット間でコードを共有する仕組みなので、"Apple Watch" や "Widget" に対応するために "WatchKit Extension" や "Today Extension" をプロジェクトに追加した場合に、機能の共有化が容易にできる。

  2. レイヤー分割と依存関係の強制
    "Embedded Framework" により機能がレイヤー分割され名前空間も分かれる。また、依存関係を明確にすることができるようになるので、コードが簡潔になる。

  3. ビルドパフォーマンスの向上
    上記の "レイヤー分割と依存関係の強制" により、Xcodeの差分コンパイルの適応スコープが小さくなり、ビルド時間が短縮される。

  4. テストの分割
    ターゲット毎にテストが追加されるので、ターゲット単位でテストを記述することができる。

Embedded Framework の導入

  1. Xcodeのツールバー "File" → "New" → "Target"、もしくはプロジェクト "General" から "Add a Target"。
    スクリーンショット 2017-12-08 20.38.42.png

  2. "Cocoa Touch Framework" を選択。
    スクリーンショット 2017-12-08 20.41.50.png

  3. フレームワーク名を入力し、"Finish"。

すると、以下のようにターゲットとフォルダが追加される。(今回は "Purchase" Frameworkを作成)
新しくできたフォルダにFrameworkのコード、およびリソースを追加していく。

スクリーンショット 2017-12-08 20.48.18.png

購入処理機能を共通化した"Purchase" Frameworkは以下のようになる。(実装は割愛)

スクリーンショット 2017-12-08 21.58.05.png

"Purchase" Frameworkを使用したい場合は、対象のファイルでimport Purchaseとするだけだ。

スクリーンショット 2017-12-08 22.03.25.png

Embedded Framework によるレイヤー分割

以下のように、"Model", "Request" をFramework化し、レイヤー分割しておけば、依存関係の整合性を保ちやすく、不適切な参照も起きにくくなる。また、先に述べたように "WatchKit Extension" や "Today Extension" と紐付けることで、Application側と "Model", "Request" を共有することが可能となる。

スクリーンショット 2017-12-08 22.18.09.png

終わりに

"Embedded Framework" の導入は、簡単かつ有用性が高いので、積極的にプロジェクトに取り入れていきたいと思っている。
本記事を読んでくださったiOSアプリエンジニアの方々にも、是非お試しいただきたい。

13
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
8