ラボノススメ井原岳志2017.06.14531302020こんにちは。スタディサプリENGLISHのiOSエンジニアをやっています。Frameworkを活用したiOSアプリの設計についてご紹介します。9日、アメリカのサンノゼで開催されたWWDC2017に参加してきました。WWDCではKeynoteをはじめとしたセッションの他に、Appleで働く様々な分野のエンジニアとディスカッションをできる『ラボ』というブースがあります。Frameworkでの設計についていろいろと質問することが出来たので、そこで得た知見も併せてご紹介します。はじめに現在、開発しているiOSアプリでは以下のような設計を採用しています。上記の設計には『下のレイヤーは上のレイヤーのことを知らない』という原則があります。SwiftではPackage単位ではなくModule単位で名前空間が管理されているので、同一のModuleに複数のレイヤーが含まれていると下のレイヤーの人が上のレイヤーの人を呼び出すことを機械的に防ぐことは出来ません。この問題を解決するためにはレイヤー毎に名前空間が管理されることで防げます。これを実現するためにはいくつかの方法があります。Typeとはclassやstructの内部に定義されたclassやstructのことを指します。}}Domainレイヤーの外からUseCaseクラスにアクセスするには、Domain.UseCaseのような記述をします。これで名前空間のようなものを実現できます。この方法では同一ファイルが高頻度で変更がされるのでチーム開発では困難な面があります。そこでExtensionを使ってファイルを分けます。これで同一ファイルの変更が多発する問題を解決できます。{}}しかし、この方法だとExtensionを多用するのでビルド時間が長時間化してしまう問題が発生してしまうため、あまり現実的な方法とは言えません。Frameworkとはターゲット間でコードを共有する仕組みです。Frameworkを生成して名前空間を実現します。実際にデモアプリを作成しましたので、詳しい構成はそちらを見ていただけると助かります。Domainと記述します。}}別レイヤーを参照する時は明示的にimport文を書く必要があるので、import文の有無で他のレイヤーに不適切に依存しているかどうかを瞬時に理解することができます。Frameworkを使用することで他にもメリットが生まれます。差分ビルドが働きやすくなるiOSアプリ開発のあるあるなのですが、1行変更したらフルビルドが走ってしまうという現象があります。Frameworkでレイヤーを管理にすることによりクラス間の依存関係が明確になるので差分ビルドが働きやすくなります。Framework毎に管理できます。Podfileの定義で各レイヤーが依存するライブラリを定義できます。Module毎に言語のMigrationが出来るSwiftではたびたび破壊的な変更がなされてきました。その際のMigration作業はかなり時間と集中を要するため、iOSエンジニアの負担になります。Swift3.2とSwift4では共存が出来るので、**Migration作業がModule毎に行うことが可能になりました。これにより一度にすべてのコードをMigrationせずに済むので、『新機能の追加開発がペンディングしてしまう』といったケースを軽減できます。Interfaceなどの仕組みが扱いづらいStoryboardはViewを管理しているので、Presentationレイヤーに属します。Interfaceで設定する際にPresentation層に属するStoryboardを参照できません。Referenceで遷移するStoryboardにも同様の問題が発生します。ResourcesをStoryboard上で参照できないためです。TargetとPresentationレイヤーに属させると解決します。Frameworkを活用してレイヤーを分けているのに2つのTargetに属させるのと意味が薄れるのでコードで記述するのが良い気がします。Frameworkを使うのはAppleの思想と異なるのではないかと考えられます。Frameworkを使ってレイヤーを管理する設計は良いアイディアだ』との回答を貰いました。Appleの思想とは大きく外れてはいなさそうです。TargetとPresentationレイヤーの両方にStoryboardを属させるしかないようです。将来的にそのような仕組みを導入することも検討していると言っていたので、そのうちサポートされるかもしれません。今後の進化に期待ですね。ラボノススメ日頃の開発で疑問に思っていることについてAppleのエンジニアと話せたのはとても貴重な体験でした。ゼクシィiOSアプリの場合2020.02.142020.02.07レガシーソフトウェアをチームで改善するためにまずしたこと2020.02.072020.01.20XcodeGenでiOSチーム開発でのストレスを軽減する2020.01.20サイト利用についてお問い合わせ採用情報リクルートグループサイトへ。