Как упомянуто выше, здесь, на SO, есть множество ответов на эти топики c, которые объясняют основные c различия, но есть некоторые тонкие детали, которые опускаются, когда речь идет о поведении и понимании того, что на самом деле происходит. и я вбрасываю свою шляпу в кольцо с ответом, надеюсь, чтобы помочь объяснить их более подробно.
Теперь давайте запачкаем руки!
Ссылки на папки
Ссылки на папки проще gr asp. Это простые указатели на реальные папки на диске. Все, что находится в папке на диске, появится в дереве проекта.
Вы определяете ссылку на папку по ее значку, который будет синим.
Вы можете включить все, что находится в этой папке в вашем приложения, выбрав ссылку на папку в дереве проекта, а затем выбрав цель, в которую она будет включена в инспекторе.
Примечание. Вы можете выбрать цель только на уровне ссылки на папку, а не на уровне отдельного файла. Это дополнение типа «все или ничего».
Важным побочным эффектом является то, что если вы можете связывать ресурсы в своем приложении из ссылки на папку, вы НЕ МОЖЕТЕ создавать исходный код из ссылки на папку. Исходный код должен быть в группах!
Группы
Группы, с другой стороны, обманчиво сложнее. В их самом простом объяснении они являются логическими контейнерами в вашем проекте XCode, которые вы используете для хранения и организации относительных указателей на файлы исходного кода. Они хранятся только в проекте XCode, а не на диске.
Вы можете идентифицировать группу в своем проекте по желтой папке.
Каждый элемент, будь то сама группа или ссылка на файл внутри группы указывается местоположение и как оно связано со структурой проекта. Это можно найти в разделе «Идентификационные данные и тип» инспектора.
Примечание ...
- Группы можно ссылка на указанную папку c на диске , но не обязательно
- Ссылка на файл обязательно точка в указанный файл c на диске.
Способ хранения этих ссылок зависит от значения параметра «Местоположение»:
- Если для параметра «Местоположение» установлено значение « Абсолютный путь », тогда ссылка будет содержать полный путь к элементу на диске.
- Если для него установлено значение« Относительно группы », то сначала определяется, к чему группа в данный момент разрешает, затем ссылки сохраняются. относительно этого значения. Это будет рекурсивно распространяться вверх по родительским группам.
В иконографии также есть небольшая разница. Если группа указывает на фактическую папку, вы просто увидите желтую папку. Однако, если группа не ссылается на указанную папку c (т.е. она только для логики), вы увидите маленький треугольник на значке папки.
Кроме того, независимо от того, подключена группа или нет, вы всегда можете увидеть текущее физическое местоположение, на которое ссылается группа или любой из ее дочерних элементов, просмотрев свойство «Полный путь» в вашем инспекторе.
Опять же, важно отметить, что ваш логическая структура групп не имеет ничего общего с физической структурой на диске . Люди регулярно делают ошибку, думая, начиная с Xcode 9, что это утверждение неверно, но читайте дальше, чтобы узнать, почему это заблуждение все еще существует.
Как уже упоминалось, группы не представляют фактические папки на диске. Это простые логические группировки исключительно для организации кода. Однако они могут указать на фактическую папку на диске. Вы определяете, какая папка находится с помощью маленькой кнопки папки в раскрывающемся меню «Расположение» в разделе «Идентификационные данные и тип» инспектора. Вы также можете очистить эту ассоциацию снова, нажав маленький кружочек в круге.
Теперь вот сложная часть, которую нужно получить. Когда имеешь дело с группами, которые не указывают на реальные папки, вся их цель состоит в том, чтобы просто помочь вам как пользователю организовать ваш код в структуру, которая имеет смысл для вас, и чтобы XCode мог разрешить фактические пути на диске к эти ссылки на файлы.
Но что, если у вас есть группа, которая указывает на папку? Что ж, теперь в игру вступает целый новый набор правил. Эти правила изменились в Xcode 9.
После Xcode 9 изменение имени группы может изменить имя на диске, но не обязательно . Это будет только , если имя группы и имя физической папки совпадают до переименования . Если они этого не делают, они для всех намерений и целей «отключены».
Например, скажем, у вас есть группа в вашем проекте под названием «Виртуальная», которая указывает на папку на диске с именем Literal, например итак ...
Group On-disk Folder
----- --------------
Virtual -> Literal
Если вы переименуете группу "Виртуальная" в "Концептуальная", на диске ничего не произойдет.
Conceptual -> Literal
Если вы затем переименуете "Концептуальная" в " «Литерал», чтобы оно соответствовало фактическому имени папки на диске ...
Literal -> Literal
..., затем снова переименуйте «Литерал» в «Изменено», и группа и папка будет обновиться до «Изменено».
Changed -> Changed
Примечание. Это не имеет ничего общего с , где папка находится на диске. Это относится только к самому имени, ничего больше.
Куда мы идем?
Что касается того, где оно находится на диске, там тоже есть сложнее, чем кажется. Если вы перемещаете группу, которая в данный момент не указывает на фактическую папку на диске, ничего не происходит, кроме обновления Xcode о том, как он сохраняет относительные пути элементов вашего проекта в файле проекта, делая их относительно обновленной структуры группы.
Однако, если вы перемещаете группу, которая в данный момент указывает на папку - , даже если ее имя не соответствует папке на диске (это критическая точка и часто - источник путаницы в отношении «поврежденных» деревьев проекта) - физическая папка на диске, на которую она указывает, будет перемещена в новое место относительно любой группы, в которую вы ее перетаскиваете, вместе со всеми элементами в этой папке на диске независимо от того, есть ли ссылка в вашем проекте или нет!
Например, скажем, у вас есть это в структуре вашего проекта ...
Project
GroupA -> Points to \Code\Project\GroupA
GroupB -> Points to \Some\Really\Deep\Path\Somewhere\Else\On\The\Disk\Entirely\GroupB
И вы перетаскиваете GroupA поэтому он находится под GroupB в дереве вашего проекта, например ...
Project
GroupB
GroupA
Поскольку GroupA указывает на физическую папку на диске (опять же, запомните, даже если они здесь делают) , имя группы и папка, на которую она указывает не должны совпадать), физический путь GroupA и все ее содержимое независимо от того, на него ссылаются фактически переместится на
\Some\Really\Deep\Path\Somewhere\Else\On\The\Disk\Entirely\GroupB\GroupA
Опять же, вы перемещаете его так, чтобы он находился под тем же путем фактического целевой группы.
Хорошая новость заключается в том, что для 95% всех вариантов использования физические папки расположены в папке проекта, и группы соответствуют друг другу со структурой этих физических папок, а все ссылки имеют значение «Относительно группы». группы по существу отражают файловую систему. Вот почему люди думают, что начиная с Xcode 9, вы модифицируете файловую систему. Вы не. Вы по-прежнему просто изменяете группы и ссылки на файлы. Просто Xcode делает предположения, что если структура ваших групп отражает физический диск, а вы переименовываете / переупорядочиваете их, скорее всего, вы также хотите обновить физический диск, так что он делает это для вас. Это очень удобно, хотя и немного вводит в заблуждение.
С этим новым знанием, если что-то выходит из строя и работает не так, как вы ожидаете, возможно, настало время проверить ссылки на ваши файлы и группы. и относительные местоположения. Убедитесь, что ссылки на ваши папки действительно указывают на то, где вы ожидаете их увидеть, особенно при обновлении старых проектов, и вы сможете довольно быстро вернуться на правильный путь.
В любом случае, надеюсь, это лучше объясняет. Конечно, помог нам! :)