Swift: # предупредительный эквивалент

192

Есть ли у Свифта эквивалент #warning? Он просто используется для отображения предупреждения в собственном графическом интерфейсе XCode

Меня также интересует, есть ли эквивалент #error.

Apple заявила, что скоро появится марка #pragma, возможно, с этим может быть то же самое.

введите описание изображения здесь

Какой-то парень
источник
7
Я предполагаю, что это будет так //WARNINGже, как #pragma, //MARKно в настоящее время ни один из них не добавлен в бета-версию XCode.
Лорд Жолт
1
Я настоятельно рекомендую заполнить радар для запроса // ПРЕДУПРЕЖДЕНИЕ
пиксель
@pixel Я только что подал радар
SomeGuy
Можете ли вы принять ответ Джордана Смита? Это теперь встроено в Swift как #warning
Билл

Ответы:

158

В будущем разработчики Apple вполне могут выпустить //WARNING:ориентир или предоставить функциональность другому названному ориентиру.

Однако, чтобы сегодня задействовать эту функциональность с помощью Swift в Xcode, вы можете сделать следующее, как обрисовано в общих чертах Беном Додсоном и Джеффри Сэмбелсом:

Добавьте новый сценарий запуска на вкладку этапов сборки целевого объекта (настройки проекта> этапы сборки> '+'> этап создания нового сценария выполнения) и вставьте следующий код в пустое поле:

TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"

Это заставит Xcode пометить предупреждение во время компиляции для любой разметки // TODO:или // FIXME:комментариев.

В качестве альтернативы, вы можете изменить TAGS с помощью пользовательского тега: TAGS="WARNING:"в приведенном выше коде, который сохранит поведение по умолчанию для TODO & FIXME и вызовет предупреждение о времени компиляции для любых комментариев, помеченных как // WARNING:.

http://bendodson.com/weblog/2014/10/02/showing-todo-as-warning-in-swift-xcode-project/ http://jeffreysambells.com/2013/01/31/generate-xcode- предупреждения-из-ToDo-комментарий

РЕДАКТИРОВАТЬ: 18/11/14

@ david-h поднял хорошую мысль в своем комментарии. Если вы хотите выдавать эти предупреждения только в конкретной конфигурации сборки, вы можете сделать следующее:

if [ "${CONFIGURATION}" = "Debug" ]; then
TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
fi

В качестве альтернативы вы можете использовать «Release» вместо «Debug» только для целевых сборок.

Кайл Дж
источник
Это очень хорошее временное решение, пока Apple его не
исправит
Проблема в том, что у моего приложения есть два режима - разработка и производство. Я хочу знать, что он работает чисто в производстве, но в процессе разработки я получаю предупреждение, которое напоминает мне, что я нахожусь в режиме разработки - использую разные URL, тайм-ауты, другие настройки и т. Д. Приведенное выше предложение Эри позволяет мне сделать это, ваша техника просто Флаги все. Тем не менее, эта техника наверняка найдет свое применение, поэтому я тоже проголосовал за нее!
Дэвид Х
Какая полезная идея! Спасибо, что поделились этой полезной информацией.
Томми,
@kyle Не могли бы вы дать мне знать значение этой строки perl -p -e "s / ($ TAGS) / warning: \ $ 1 /"
Rocker
3
Прекрасно работает, однако мне пришлось добавить -type fопцию в findкоманду, чтобы исключить каталоги из результатов поиска. Это не должно быть проблемой для большинства людей, но любой, кто использует R.swiftмодуль, столкнется с той же ошибкой, что и я, потому что R.swiftэто каталог
Dan F
156

редактировать

Начиная с Swift 4.2, поддержка языкового уровня доступна как для предупреждений сборки, так и для ошибок.

#warning("Warning description")
#error("Throws a build error")

Оригинальный ответ

Быстро, грязно, и о, так элегантно просто все одновременно.

// Description of what you need to fix

var FIX_ME__🛠🛠🛠: AnyObject

Выдает предупреждение, что 'FIX_ME__🛠🛠🛠' никогда не использовался.

Вы можете добавить смайлики к имени переменной, если хотите ... Я часто использую 😱 и 🛠, для чего-то, что действительно нуждается в исправлении, я бы даже подумал 💩. Вы можете заменить FIX_ME__с тем, что вы хотите: ALGORITHM_NEEDS_REVIEW, BugID_148или JOHNNY_YOU_BROKE_THISнекоторые примеры.

Быстрый, без настроек, лаконичных и смайликов может даже добавить юмор / индивидуальность в ваш код. Иногда самое простое решение - лучшее решение.

Джордан Смит
источник
6
... почему все проголосовали? Это работает так же, как и любой другой метод здесь. Если вы отказываетесь голосовать, по крайней мере, объясните причину, возможно, я не достаточно ясно, или что-то не так с тем, что я делаю. Я хотел бы знать, если есть.
Джордан Смит
16
Да, я не уверен, почему за это больше не голосуют. Все остальные решения слишком сложны.
Симона Манганелли
3
@ZaEeMZaFaR компилятор, скорее всего, избавится от него. Кроме того, в большинстве случаев эти проблемы будут исправлены перед выпуском. И - даже если по какой-то причине компилятор не достаточно умен, чтобы от него избавиться (я думаю, что это очень маловероятно) - 100 Int переменных в памяти - это 6,4 КБ памяти - практически ничего. Я не думаю, что вы правильно поняли, извините.
Джордан Смит
4
Я использовал другие, но переключился на использование этого. Это самое простое, и вы можете даже дать себе маленькое сообщение, которое будет отображаться в предупреждении, то есть: let fixMeMakeMeNonOptional: Intдаст вам Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it в навигаторе проблемы. Все остальные решения дают вам гораздо более общие сообщения об ошибках.
Натан Перри
1
@NathanPerry да, согласился. Настройка какой-то сложной вещи не всегда возможна, особенно когда вы работаете в команде или в нескольких проектах и ​​т. Д. Кроме того, простые решения всегда являются лучшими. В настоящее время я просто помещаю сообщение рядом с ним в комментарии, но то, что вы делаете, тоже неплохая идея.
Джордан Смит
81

Сообщение WWDC 2018 Обновление

Начиная с Xcode 10 и Swift 4.2, вы теперь сможете #warningснова использовать это так:

#warning("TODO: Clean up this code after testing")

Это будет отображаться как предупреждение в Xcode, как и ожидалось!

Это работает даже в сочетании с #ifпроверками, например, следующее будет отображать предупреждение, только если ваша целевая платформа - iOS:

#if os(iOS)
    #warning("this code is untested in iOS")
#endif

Там также, #errorесли вы хотите, чтобы ваша сборка провалилась.


Предварительно WWDC 2018 Ответ

В Swift с использованием XCode 6 вы можете использовать различные виды ориентиров для разных целей. Вот что Apple говорит об этом:

Xcode теперь поддерживает // MARK :, // TODO: и // FIXME: ориентиры для аннотирования вашего кода и перечисления их в панели переходов.

Поэтому для установки предупреждения с описанием вы должны использовать что-то вроде этого:

//TODO: Clean up this code after testing

Если вы просто хотите установить короткую отметку (при условии, что вы помните, что делать), используйте это:

//FIXME

РЕДАКТИРОВАТЬ: Эти ориентиры, однако, появляются только в панели переходов XCode, которая может не соответствовать вашим ожиданиям и ожиданиям, особенно по меткам // TODO: и // FIXME. Я подал радар об этом: # 17776817. Надеюсь, Apple добавит это в ближайшие сборки в XCode 6.

РЕШЕНИЕ (РЕДАКТИРОВАТЬ 2): Если вы установите Swift Linter через Homebrew (запустите brew install swiftlintпосле a brew update) и добавите предлагаемый сценарий сборки в свой проект, то вы увидите, что все ваши TODOи FIXMEориентиры отображаются в виде предупреждений в Xcode. SwiftLint даже добавит еще несколько предупреждений / ошибок, которые вы можете настроить в соответствии со своими потребностями - я могу только рекомендовать использовать SwiftLint, и это решает эту проблему великолепно!

Jeehut
источник
7
К сожалению, они не отображаются на панели предупреждений при компиляции приложения. Я все еще жду тот, который торчит как больной большой палец, так что вы вряд ли о них забудете. Они просто появляются на панели переходов, и вам нужно помнить, чтобы искать в вашем проекте "// TODO", чтобы найти его. Или, если кто-нибудь знает, как их увидеть для всего проекта, дайте мне знать. - время для другого радара :)
SomeGuy
1
Ах да, ты прав. Я думал, что панель перехода - это боковая панель слева, и что эти метки будут отображаться в Навигаторе ошибок, но это не так. Я только что подал радар об этом: # 17776817. :)
Jeehut
@SomeGuy Что вы имеете в виду, когда они появляются на панели? Из того, что я вижу, они не находятся на панели, расположенной в верхней части окна редактора в Xcode. Единственный способ заметить их (для меня), кажется, искать их с помощью Command + F. Где показаны ориентиры?
Almel
2
@almel Панель перехода - это раскрывающийся список в верхней части файла, в котором содержится список функций в текущем файле i.cubeupload.com/jLRwTs.png
SomeGuy
55

Все еще не добавлено командой Apple. То, что я решил сделать, это, вероятно, мошенничество, но, по крайней мере, оно показывает мне сообщение FIXME. Поэтому я объявляю функцию FIXME () в файле Swift:

@availability(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
func FIXME()
{
}

и когда я вызываю его из любой другой функции, он показывает предупреждение, например

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    FIXME()     // Incomplete method implementation.
    return 0
}

введите описание изображения здесь

Для Swift 2 используйте

@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
прерывание
источник
2
Просто для записи: @availability был переименован в "@available" в Swift 2.
Тобиас
42

Посмотрите на эту статью .

Вы можете написать свой собственный скрипт, который выделит все теги.

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/"

Это приводит к: введите описание изображения здесь

келин
источник
Добавить egrep --directories='skip'игнорировать каталоги с именами , как Device.swift
chunkyguy
12

В качестве альтернативы, если вы хотите, чтобы что-то отображалось на панели предупреждений, вы можете написать что-то вроде:

if (false){
   var x = 2;
}

Вы не можете получить какой-либо текст для отображения, но по крайней мере это более заметный маркер, особенно если вы склонны воспринимать (большинство) предупреждений как ошибки.

Арье Литовский
источник
11
Или просто сделайте, если false {"предупреждающее сообщение"}
Бао Лей
Это решение ужасно. Но, кажется, лучший из доступных. Проголосовал, спасибо.
skagedal
6

Я предложил и реализовал эту функцию, и она будет поставляться с Swift 4.2. Вы можете использовать его сейчас, загрузив masterнабор инструментов на swift.org .

#if os(macOS)
  #error("macOS is not supported")
#endif
#warning("finish this")
Харлан Хаскинс
источник
5

Один CocoaPod, который я использовал, имел .swiftсвое имя, поэтому был возвращен каталог, что вызвало сбой скрипта Кайлом. Добавление -type fк findкоманде устраняет эту проблему, просматривая только совпадающие файлы, *.swiftа также возвращая каталоги, соответствующие шаблону.

Окончательный код, который я использовал:

TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -type f -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
sflogen
источник
1
Есть ли способ, чтобы компилятор не жаловался? Я получаю сообщение «Ошибки,
выданные командой
В качестве альтернативы см. Этот комментарий выше
chunkyguy
4

Если вы не хотите корректировать настройку сборки, еще одно простое домашнее средство - вставить заполнитель редактора перед комментарием:

<#todo#>// stop and fixme!

При сборке вы получаете ошибку «Редактор заполнителя в исходном файле», но в отличие от решения Джордана, нет живой ошибки, которая вас раздражала бы при наборе:

заполнитель редактора

Мин Нгуен
источник
Хорошая идея - но разве идея не выдать предупреждение, а не ошибку? Выполнение этого не позволит вам собрать, пока вы не удалите его, что во многих (большинстве?) Случаях определенно не то, что вы хотите. Метки Todo и fixme иногда требуют недельной работы - я думаю, вы захотите собрать и запустить свой проект в это время :)
Джордан Смит
Конечно, это хороший момент. Этот подход полезен только для более срочных задач, которые должны произойти перед фиксацией или даже запуском приложения. Основное преимущество заключается в том, что подсветка синтаксиса и другие тонкости редактора продолжают работать, несмотря на наличие этого заполнителя. Я сам использую некоторые другие подходы, в том числе и ваш, но заполнители иногда полезны при многозадачности. Это соответствует тем же случаям использования, что и Xcode-заполнители, вставляемые при автозаполнении вызова функции.
Minh Nguyễn
3

После долгих поисков и тоски я убежден, что такой сущности не существует. Я все еще надеюсь, что последние заметки о выпуске Xcode будут содержать упоминание о продолжающемся отсутствии механизма #pragma mark, также могут появиться #warning и #error.

Кроме того, я настоятельно рекомендую зарегистрировать радар в Apple на bugreport.apple.com, чтобы добавить эту функциональность (вы можете обмануть 17702491).

rcw3
источник
1
Я выполнил свою часть: rdar: // 19005171
Дэвид Х
1
Также залил радар
HixField
2

Мы написали настраиваемый инструмент, который позволяет помещать предупреждения и ошибки в Xcode Issue Navigator на основе тега комментария и конфигурации сборки: https://github.com/doubleencore/XcodeIssueGenerator

Установите это:

brew tap doubleencore/tap
brew install xcodeissuegenerator

Затем поместите строку в фазу запуска сценария запуска:

# Mark WARNINGs, SERIOUSs, and TODOs as warnings in DEBUG builds excluding the Vendor and Third Party directories.
XcodeIssueGenerator -b DEBUG -w "WARNING, SERIOUS, TODO" -x "Vendor/, Third Party/"

Вот статья, описывающая, как мы ее используем.

soolwan
источник
2

Я могу опоздать на вечеринку с Xcode 10, поддерживающим ошибки и предупреждения, но просто помещая строку:

"Need to finish implementing this"

выдаст предупреждение: String literal is unusedавтозаполнение все еще работает, а проект все еще компилируется.

Пшемыслав Вжесинский
источник
1

Мой ответ не совсем удовлетворит ваш вопрос, но если вы хотите что-то легкое, вы можете использовать этот плагин alcatraz, который работает во всех проектах без каких-либо дополнительных приготовлений. Просто сделайте следующее:

1) install Alcatraz (Nice package manager for Xcode Plug-ins) by entering this line in terminal: 
curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
2) Then restart Xcode and on it launch agree to install all bundles not included in Xcode
3) In Xcode select menu item -> Window -> Package manager -> type in search panel XTodo and press install
4) Relaunch Xcode and again agree to install additional bundles
5) From now press Ctrl + T and you will see all Tags in nice window

Он также имеет настройки для добавления новых тегов

введите описание изображения здесь

Николай Шубенков
источник
1

Преимущество этого фрагмента - он не показывает предупреждения от модулей:

if [ "${CONFIGURATION}" = "DEBUG" ]; then 
    TAGS="TODO:|FIXME:|WARNING:|warning:" find "." \( -name "*.swift" \) -not -path "./Pods/*" -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
fi

Как установить:

введите описание изображения здесь

Игорь
источник