質問: Xcode10.1を使用して、ObjectiveCを使っています。 storybordは使用せず、xibとコードで画面を作成しています。 いくつかのアプリのソースが同じであることから、 共通部分を抜き出し、別プロジェクトとし、他のプロジェクトから使用できるようにしたいと考えています。 やり方はいろいろあるのかもしれませんが、ネットで探していきついた以下を試してみようとしています。 ・workspace作成 複数のプロジェクトを一つのwindowで開ける そのビルド結果をworkspace内で参照し合える 他のプロジェクトを参照した場合、ビルド時にそのプロジェクトもビルドし直してくれる 上記のようなもの...らしいので、 プロジェクトAから、プロジェクトA-1、プロジェクトA-2(共通ソース) このように切り出して、workspaceにA-1、A-2を置けば参照できるのではと考えました。 以下を参考にworkspaceにA-1のプロジェクトを追加しました。 上記のサイトでは共通ソースはCocoa Touch Frameworkで作成しています。 そこで 疑問なのですが、workspace内で参照するためには、プロジェクトA-2(共通ソース)は 普通のプロジェクトではだめなのでしょうか? 上記のサイトでは「Cocoa Touch Framework」から作成とあります。 また、xibなどViewクラスなども共通化可能なのでしょうか? ![画像の説明をここに入力](https://i.stack.imgur.com/jFkFr.png)
回答: 特にフレームワークにする必要はありません。一つのワークスペース・プロジェクトから2つや3つのアプリケーションを作成することは可能です。 Xcodeのファイルの管理階層は WorkSpaceが一番土台にあり、その上に各プロジェクトが、更にその上に各ターゲット(ソースナビゲーターの一青いプロジェクトアイコンを押し、隣のウィンドウの一番下にある+ボタンでターゲットを追加、ウィンドウ左上で切り替え可能)、更にその上にソースファイル群があり、同じワークスペース内のどのターゲットにどのソースファイル(ストーリーボードやxibファイルも同様)が必要か?は設定次第で自由自在です。 参考にされたサイトは「更に別なプロジェクトでも再利用すること」を考慮して、プログラムの一部を`framework`として作成し、作成された`framework`を同じワークスペースの別`target`に取り込む様にしているのだと思います。 このメリットは、別なプロジェクトを作成したときにそのプロジェクトに追加すべきファイルは、`なにやら.framework`だけで済むということです。 ここから余談 一つのワークスペースまたはプロジェクトには、共通に使い回せるソースが一部あっても、大きくアプリケーションが異なるのであれば、ワークスペース・プロジェクトを一つに纏める意味はあまり無いのではないでしょうか? 参考にされたサイトで`cocoa touch framework`に共通部分をまとめた(追いだした)理由の一つだと思います。 その様な場合は`framework`というコンパイル済みのライブラリーを作成し、アプリケーションAと異なる用途のアプリケーションBで、それぞれ、共通部分だけを纏めた`framework`を事前に作成し、それぞれでインポートすれば`framework`自体は再コンパイルする必要もソースコードも必要が無く、動作も保証されているため手軽に使えます。 さらに、今まで作っていたアプリケーションA,Bの他にアプリケーションCを同じプロジェクトに追加したところ、共通部分にアプリケーションA,Bでは起きなかった問題が起き、共通部分を修正した場合にアプリケーションCを再コンパイルするにあたって、アプリケーションA,Bもコンパイルしなければいけないのではないか?と問題が複雑になっていきます。 このため、 * 共通部分はフレームワークに纏め、それをインポートし合う * 最初にフレームワークを作るプロジェクトは必要だよね?だからどこかにフレームワークを作成するターゲットは必要 * それ以降は、作成されたフレームワークだけをプロジェクトに追加すればそれで充分じゃない? * 一つ(のワークスペース/プロジェクト)に何でもかんでも詰め込むと複雑すぎて思わぬミスを招くよね。だから、一つのワークスペース・プロジェクトが管理するターゲットは必要最小限に すると良いと思います