Этот пост является вольным переводом статьи «How to highlight your TODOs, FIXMEs, & ERRORs in Xcode» за авторством Hector Matos.
Это был самый обычный день: я писал код, устранял баги и вообще все было прекрасно. Именно тогда я написал блок кода, к которому нужно было вернуться позже. Это обычный случай, с которым вы тоже вероятно сталкивались: нужно было взаимодействовать с API, который еще не был готов. Я знал общую структуру объекта, который получу по API, но я еще не мог протестировать работу с ним. Как и любой другой разработчик, я написал комментарий, который выглядит так:
В этот момент я хотел бы создать предупреждение в Xcode, такое же как мы привыкли делать в Objective-C с помощью директив компилятора:
Но увы, так не получилось и я загрустил.
Как человек действия, я сделал то, что и следовало: я действовал. Оказывается, вы можете добавить run-скрипт, чтоб получить необходимый функционал.
RUN SCRIPT BUILD PHASES
Xcode поддерживает внутренние bash-команды или скрипты в различных фазах вашего цикла разработки. Вы можете запустить bash-скрипт в любое время до или после сборки, запуска, тестирования, профилирования, анализа или даже архивирования.
Чтобы сделать это, перейдите в «Build Phases» своего проекта в Xcode, нажмите на "+" слева вверху и затем из выпадающего меню выберите «New Run Script Phase»:
Затем вы увидите новый раздел, в котором можете написать bash-скрипт. Если вы уже эксперт по написанию Swift-скриптов после прочтения поста scripting in swift, вы можете просто положить файл со скриптом в корневой каталог проекта и вызвать его из своего нового run-скрипта.
# Отмечаем ваши TODO, FIXME и ERROR с помощью «родных» предупреждений Xcode
В тело вашего run-скрипта поместите вот этот замечательный код:
```bash
TAGS=«TODO:|FIXME:»
find "${SRCROOT}" ( -name "*.h" -or -name "*.m" -or -name "*.swift" ) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*$" | perl -p -e «s/($TAGS)/ warning: $1/»
```
С этого момента вы будете видеть предупреждения когда поставите метку TODO: или FIXME: в комментарии! Посмотрите, как работает эта магия:
Не будем останавливаться на достигнутом и исправим скрипт таким образом, чтобы подсвечивать ошибки используя //ERROR: в комментариях. Как вы знаете, бывают ситуации, когда мы хотим обратить особое внимание, выделив ошибку с помощью //ERROR:. Чтобы сделать это, измените ваш bash-скрипт вот так:
```bash
TAGS=«TODO:|FIXME:»
ERRORTAG=«ERROR:»
find "${SRCROOT}" ( -name "*.h" -or -name "*.m" -or -name "*.swift" ) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*$|($ERRORTAG).*$" | perl -p -e «s/($TAGS)/ warning: $1/» | perl -p -e «s/($ERRORTAG)/ error: $1/»
```
Не знаю, как вы, но я, наверное — самый забывчивый человек в мире. В конце дня у меня не всегда закончен текущий фрагмент кода и мне нравится использовать //ERROR: чтобы напомнить самому себе над чем работать завтра.
Когда моя IDE выглядит так, я сразу чувствую, что необходимо закончить уже начатое. И не переживайте, ошибки генерируемые этим скриптом не препятствуют сборке проекта.
ЗАКЛЮЧЕНИЕ
В своей повседневной работе вы всегда столкнетесь с блоком кода, к которому нужно будет вернуться позже, но сейчас вы вынуждены поставить «заплатку» и двигаться дальше. К сожалению, даже простого //TODO:, //FIXME: или //ERROR: в комментарии, просто недостаточно. Вы удивитесь сколько людей забывают о своих //TODO:, //FIXME: и //ERROR: в проекте. Использование run-скрипта в этой ситуации — отличный способ, чтобы убедиться, что не упустите ничего в своем цикле разработки. Надеюсь, это поможет.
Счастливого кодинга, товарищи ботаники!
П.С. Из комментариев к оригинальному посту извлечена еще одна модификация скрипта, на случай если вам все-таки нужно препятствовать сборке проекта при наличии пометок //ERROR: в коде:
```bash
TAGS=«TODO:|FIXME:»
ERRORTAG=«ERROR:»
OUTPUT=$(find "${SRCROOT}" ( -name "*.h" -or -name "*.m" -or -name "*.swift" ) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*$|($ERRORTAG).*$" | perl -p -e «s/($TAGS)/ warning: $1/» | perl -p -e «s/($ERRORTAG)/ error: $1/»)
ECHO "$OUTPUT"
if [[ $OUTPUT == *" error: "* ]]
then
exit 1
fi
```
Автор: s_suhanov