Xcode ужасен, и об этом много кто говорит. Постоянные ошибки, баги интерфейса, неочевидное поведение и местами плохая документация — всё это мешает спокойно писать код. Вместо работы над проектом приходится искать решения проблем и пытаться починить то, что должно работать из коробки. Ещё одна неприятность на этом пути заключается в том, что Apple не всегда публично рассказывает о багах в Xcode, поэтому надо ещё догадаться, что именно не работает.
В этой статье автор делится ошибками и «особенностями» Xcode, которые больше всего его раздражают. Главный совет: держитесь подальше от этой IDE и всегда ищите альтернативы.

The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions
Если вы пишете SwiftUI-код в Xcode, то будете часто видеть эту ошибку. Знаете, что она означает? Что компилятор сдаётся, и дальше вы работаете сами по себе. Ошибка указывает на файл и функцию, но сама проблема может быть в любом месте вашего проекта. Это может быть просто синтаксическая ошибка, а может даже код, который оказался «слишком сложным» для компилятора. Надеюсь, вы часто коммитите, потому что Xcode превращается в Notepad до тех пор, пока вы не разберётесь, что с ним происходит.
Раз уж заговорили про Git, то давайте посмотрим на файл проекта (myProject.xcodeproj/project.pbxproj), в котором хранятся все настройки, конфигурации сборки, ссылки на файлы, параметры подписей и всё, что только может пригодиться. Если в этом файле есть ошибки, то проект просто не откроется. Он состоит из тысяч строк, которые не предназначены для чтения человеком. Вот небольшой пример:
7A226CEB2D722B3C001539F8 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 7A226C922D722973001539F8 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = E826FA0DCB9AA6E7829C68391B323B78;
remoteInfo = "GTMSessionFetcher-GTMSessionFetcher_Core_Privacy";
};
Я не буду объяснять, что это всё значит, потому что сам толком не понимаю. Единственный способ разобраться с ним — использовать xcodegen, чтобы переписать настройки проекта в человекочитаемый формат вроде YAML, а из него уже сгенерировать файл Xcode project. Кстати, весь UI-слой приложений на UIKit хранится в таких же нечитаемых файлах. Только представьте себе это.
Посмотрите на диалоговое окно ниже:

Видите странную тёмную тень под ним? Нет, это не баг интерфейса, а <positive finite integer> диалоговых окон, наложенных друг на друга. Каждое из них ждёт, чтобы вы ввели пароль администратора. Вы будете понимать, что окна заканчиваются, когда тень начнёт светлеть.
У любого софта есть баги и неудачные решения. Я не хочу сказать, что Xcode плохой только потому что он забагованный (хотя багов в нём очень много). Он отвратительный потому что отрицает этот факт. Вспомните ошибку из начала статьи: unable to type-check this expression in reasonable time; try breaking up the expression. Это не баг и не краш, но оно всё равно займёт ваше время. Попробуйте отрефакторить код, не зная в чём именно проблема. Да, всё это без помощи компилятора.
Представьте, вы тестируете покупки в приложении (Бог в помощь). Вы чётко следуете документации Apple, создаёте sandbox-аккаунт и запускаете симулятор. Apple утверждает, что sandbox-аккаунт появится в настройках смартфона сразу после запуска приложения, но, разумеется, этого не происходит. Вы попытаетесь выполнить вход вручную и увидите это:

Хорошо, возможно, опечатались во время ввода пароля. Пробуете ещё раз, и ещё раз, и ещё десять раз. Подумаете, что не стоило пропускать настройку 2FA. Настраиваете и всё равно ничего не происходит. Открываете отладчик и читаете: Password reuse not available for account. The account state does not support password reuse. Да как так? Вы же не переиспользуете пароль. Начинаете думать, что это нельзя протестировать в симуляторе, хотя в документации нет ни слова об этом. Идёте на форумы разработчиков. На них одни уверяют, что в симуляторе всё отлично работает, другие парируют — не работает. Нет ни ответов на вопрос, ни понятной информации.
Со временем вы начинаете понимать, что Apple нельзя доверять. Над всем, что она делает, лежит туман недосказанности. Смотрели записи WWDC с докладчиками, для которых произнести как можно больше прилагательных — вопросы жизни и смерти? По сути, это просто реклама. Например, смотреть презентацию SwiftUI Preview (фича, с помощью которой можно видеть обновление UI без полной пересборки приложения, не путать с реально полезным hot reload во Flutter и веб-фреймворках) и пытаться пользоваться этим — совершенно разные вещи. Годы идут, функцию улучшают, но она всё ещё плохо работает. Только представьте, как ужасно всё было во время релиза. Но на WWDC вам про это не скажут. Вы услышите только про «передовые» возможности.
А теперь о главном. О том, с чем я не могу и не хочу мириться: у Apple закрытый баг-трекер. Вы можете отправить сообщение об ошибке, но трекер — чёрная дыра. Информация в него заходит, но не выходит. Появились мысли, что странное поведение навигации не ваша вина? Хотите найти информацию о чём-то похожем в аналоге Github Issues, чтобы узнать, кто сталкивался с такой же ошибкой? Извините, но пусть лучше тысячи разработчиков по отдельности узнают о скрытых багах, чем Apple публично признает их.
На самом деле проблема не только в скрытых ошибках и багах. Сам Xcode вместе со своей экосистемой выглядит удручающе. Сейчас почти нет альтернативных редакторов с подсветкой кода и автоматическим дополнением кода. Что-то похожее можно получить из neovim и xcode-build-server, но это не самое стабильное решение. AppCode от JetBrains несколько лет назад убили, а у CLI-решения плохо задокументированы. Немного спасает Fastlane, но сам факт наличия огромного опенсор-проекта от Google, решающего проблемы IDE — абсурд. Ну и, разумеется, что работать вы должны только на Mac.
Вообще, я учился работе в Xcode ещё до того, как автоматическое управление памятью (Automatic Reference Counting, ARC) появилось в Objective-C. Я уверен, что это затормозило мой рост как разработчика и сформировало плохие привычки. Вместо того чтобы решать проблему и копать глубже, редактор предлагал перезапустить Xcode, пересоздать проект, перезагрузить Mac или перейти на бета-версию. Безусловно, я мог бы стараться быть более вдумчивым, но сложно одёргивать себя от вредных советов, когда сама IDE работает против тебя.
Я хочу, чтобы опыт разработки в Xcode был лучше, но Apple не хочет разбираться со своим техдолгом. Я советую начинающим разработчикам держаться подальше от Xcode, а если вы им уже пользуетесь и начинаете сомневаться в своей вменяемости, то знайте — дело не в вас. Просто Xcode отстой.