Swift

【Xcode】ファイル追加削除するときの注意

はじめに

Xcodeでファイル追加や削除をするときに知らないとおそらく確実に最初にはまってしまう落とし穴があるので今回まとめていこうと思います。

iOSアプリ開発をする際に実際のファイル階層とXcode上で表示されるファイル構造は異なっています。それを管理しているのがprojectファイルで、実際のファイル階層がXcode上でどの階層になっているかを管理するファイルになっています。
それゆえにファイル追加や削除をする際に注意が必要になってきます。

ファイル追加

今回aaa.txtを作成しXcodeに追加します。
Xcode上にドラッグ&ドロップして追加することができますが、その際にこのような画面がでてきます。

ここが最重要ポイントで一番上のCopy items if neededにチェックを入れてください。
Finishを押すとファイルが追加されます。

無事できました。
では、さっきのCopy items if neededにチェックをいれないとどうなるか試してみます。

このようにチェックを入れたときと同様ファイルが追加されてるように見えますが、ディレクトリの中身を確認してみると、

aaa.txtは存在していません。
gitprojectファイルの変更差分をgit diffで確認してみると、


% git diff ../SampleApp.xcodeproj/project.pbxproj                                                                                                                                                                                  
  [15:55:46]
  diff --git a/SampleApp.xcodeproj/project.pbxproj b/SampleApp.xcodeproj/project.pbxproj
  index dfda407..6006a8f 100644
  --- a/SampleApp.xcodeproj/project.pbxproj
  +++ b/SampleApp.xcodeproj/project.pbxproj
  @@ -7,6 +7,7 @@
          objects = {
  
   /* Begin PBXBuildFile section */
  +               C50B01181F36F4B900331006 /* aaa in Resources */ = {isa = PBXBuildFile; fileRef = C50B01171F36F4B900331006 /* aaa */; };
                  C5ED9AA11ED351FE00AF40C7 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5ED9AA01ED351FE00AF40C7 /* AppDelegate.swift */; };
                  C5ED9AA31ED351FE00AF40C7 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5ED9AA21ED351FE00AF40C7 /* ViewController.swift */; };
                  C5ED9AA61ED351FE00AF40C7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C5ED9AA41ED351FE00AF40C7 /* Main.storyboard */; };
  @@ -36,6 +37,7 @@
   /* End PBXContainerItemProxy section */

   /* Begin PBXFileReference section */
  +               C50B01171F36F4B900331006 /* aaa */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = aaa; path = ../../Desktop/aaa; sourceTree = ""; };
                  C5ED9A9D1ED351FE00AF40C7 /* SampleApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SampleApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
                  C5ED9AA01ED351FE00AF40C7 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
                  C5ED9AA21ED351FE00AF40C7 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
  @@ -109,6 +111,7 @@
                                  C5ED9AA71ED351FE00AF40C7 /* Assets.xcassets */,
                                  C5ED9AA91ED351FE00AF40C7 /* LaunchScreen.storyboard */,
                                  C5ED9AAC1ED351FE00AF40C7 /* Info.plist */,
  +                               C50B01171F36F4B900331006 /* aaa */,
                          );
                          path = SampleApp;
                          sourceTree = "";
  @@ -240,6 +243,7 @@
                          files = (
                                  C5ED9AAB1ED351FE00AF40C7 /* LaunchScreen.storyboard in Resources */,
                                  C5F060B31F1F3F450034FD0E /* TableViewCell.xib in Resources */,
  +                               C50B01181F36F4B900331006 /* aaa in Resources */,
                                  C5ED9AA81ED351FE00AF40C7 /* Assets.xcassets in Resources */,
                                  C5ED9AA61ED351FE00AF40C7 /* Main.storyboard in Resources */,
                          );

これのこの部分を見てみると、


+               C50B01171F36F4B900331006 /* aaa */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = aaa; path = ../../Desktop/aaa; sourceTree = ""; };

このように追加したファイルのパスが僕のPCのデスクトップになっています。

つまりCopy items if neededにチェックをいれないと、元々aaa.txtは、僕のPCのデスクトップにあったのでXcode上では、特に問題なさそうに見えますが、実際にはデスクトップにある元のファイルを直接参照しています。

1人で開発してる場合は特にエラーも発生せずに進んでしまいますが、共同開発する際に他の人が開発する際にはその人のPCのデスクトップにはaaa.txtは存在しないのでエラーになってしまいます。

Copy items if neededにチェックを入れた場合はコピーが作られ、このプロジェクトの管理下のディレクトリに保存されようになるのでこのようなエラーは発生しません。
なので基本的に、Copy items if neededにチェックを入れるようにしましょう。

ファイル削除

次はファイル削除です。右クリックしてDeleteを選択して削除することができます。

するとこのような確認画面がでてきます。

ここも注意が必要です。
何も考えずに青いボタンを選択してしまうと、Xcode上ではファイルが削除されたように見えますが、

このようにファイル自体は残ったままになってしまいます。

これもRemove Referenceからなんとなくわかるかと思いますが、Projectファイルでの参照を消すだけなので実際にファイルを削除してるわけではありません。
こちらに関しては特にエラーが出るわけではありませんが、不要ファイルが残り続けてしまい無駄な容量を食ってしまいます。

なので一番右のMove to Trashを選択すればファイルも削除されるので、基本的にはこちらを選択するようにしましょう。

まとめ

  • ファイル追加のときは、Copy items if neededにチェックをいれる。
  • ファイル削除のときはMove to Trashを選択する。