Xcode 4 のユニバーサルプロジェクト構成を考える

Xcode 3 から Xcode 4 になってウィザードから生成されるプロジェクトの構成も変わっている。
iPhone, iPadで共通化するユニバーサルで、ユニットテストありにした Windows Base プロジェクトを生成すると下記のようになる。

ファイルシステム上は、プロジェクト名のフォルダにxcodeprojectフォルダさらに同名のプロジェクトフォルダとTestsがサフックスに付いたテストフォルダが並ぶ。
プロジェクトフォルダにはiPhone, iPadが並ぶ。

WindowExample
  -  WindowExample.xcodeproj
  -  WindowExample
         -  iPhone
         -  iPad
  -  WindowExampleTests

Xcode 3 のようにClasses, Resourcesがない。自分も経験的に、XIBファイルと対になるViewControllerクラスは並んでいた方が扱いやすい。テンプレートでクラスを追加したときに同時に生成されるのでまとまっていた方が良いだろう。
ユニーバサルであればビューのベース部分やそもそも共通クラスがある(Common)。さらにイメージファイルもグループ化すると良いだろう(Images)。ほかにもユーティリティ群などが並ぶだろう(Utilities)。
ファイルシステム上もiPhone, iPad, Common, Images, Utilitiesはフォルダにする。クラス数が多ければ各グループ内もさらにグループ化した方がいいだろう。


ただこれらのグループは、画面数の増加などアプリの修正・機能追加に伴って柔軟に変えられる方が良いと考える。よって、ファイルシステム上はフラットに管理することにする。

WindowExample
  -  WindowExample.xcodeproj
  -  WindowExample
         -  iPhone
         -  iPad
         -  Common
         -  Utilities
         -  Images
  -  WindowExampleTests

XcodeVisual Studio Eclipse のようにプロジェクトのファイル構成がファイルシステムと同一ではない。Java をやってきた人には気持ち悪いかもしれない。パッケージや名前空間という概念は Objective-C にはない。グループはあくまでも人間から見た管理のしやすさだ。
Xcode はファイル追加後にファイルシステム上の移動をするのが非常に面倒である。このため、ファイルの上の場所は追加するときに確定させた方が良い。ただグループもフラットだと管理上破綻するだろう。これが前述のような構成にした理由だ。

まとめると、

  • プロジェクトフォルダ、テストフォルダを分ける。
  • プロジェクトフォルダの直下は、iPhone, iPad, iPhoneiPad共通でグループをわける。
  • これらのグループはそのままファイルシステム上フォルダ化にする。
  • 第2階層以降のグループは Xcode プロジェクトのみで管理し、ファイルシステムには適用しない。

となる。