Швидкий: еквівалент # попередження


192

Чи є у Свіфта еквівалент # попередження? Він просто використовується для показу попередження у власному графічному інтерфейсі Xcode

Мене також цікавить, чи є еквівалент #error.

Apple сказала, що знак #pragma скоро з'явиться, можливо, це може бути те саме.

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


7
Я припускаю, що це буде так //WARNINGсамо, як буде #pragma, //MARKале наразі жодна з них не додається до бета-версії XCode.
Лорд Золт

1
Я настійно пропоную подати радіолокатор, щоб попросити // ПОПЕРЕДЖЕННЯ
піксель

@pixel Я щойно подав радіолокатор
SomeGuy

Чи можете ви прийняти відповідь Джордана Сміта? Тепер це вбудовано в Swift як # попередження
Білл

Відповіді:


158

Надалі Apple Devs може дуже добре випустити //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- попередження-від -до-коментарів

РЕДАКТ: 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

Крім того, ви можете використовувати "Випуск", а не "Налагодження", щоб орієнтуватися лише на виробничі збірки.


Це дуже приємне тимчасове рішення, поки Apple не виправить це :)
SomeGuy

Проблема в цьому полягає в тому, що у мого додатка є два режими - розробка та виробництво. Я хочу знати, що він створює чисто виробництво, але я отримую попередження щодо розвитку, яке нагадує мені, що я перебуваю в режимі розробки - використовуючи різні URL-адреси, тайм-аути, інші налаштування тощо. Пропозиція Аррі вище дозволяє мені це зробити, ваша техніка просто прапори все. Однак, ця методика користується точно, тому я також проголосував за неї!
Девід Н

Яка корисна ідея! Дякуємо, що поділилися цією корисною інформацією.
Томмі

@kyle Чи можете ви, будь ласка, повідомте мені про значення perl -p -e "s / ($ TAGS) / попередження: \ $ 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 vars в пам'яті становить 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

EDIT: Однак ці орієнтири відображаються лише на панелі стрибків XCode, яка може бути не тим, чого ви хочете, і чого можна очікувати, особливо від знаків // TODO: та // FIXME. Я подав радари на те: # 17776817. Сподіваємось, Apple додасть це у наступних складах у XCode 6.

РІШЕННЯ (EDIT 2): Якщо ви встановите Swift Linter через Homebrew (запустіть brew install swiftlintпісля a brew update) та додасте запропонований сценарій збірки до свого проекту, ви побачите, що всі ваші TODOта FIXMEорієнтири відображаються як попередження в Xcode. SwiftLint навіть додасть ще кілька попереджень / помилок, які ви можете налаштувати відповідно до ваших потреб - я можу лише рекомендувати використовувати SwiftLint, і це прекрасно вирішує цю проблему!


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
Тільки для запису: @available швидко перейменовано на "@available"
Tobias

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
Або просто зробіть, якщо невірно {"попередження повідомлення"}
Бао Лей

Це рішення жахливе. Але, здається, найкраще з наявних. Проголосували, спасибі
skagedal


5

Один CocoaPod, який я використовував, мав .swiftсвою назву, тому каталог було повернуто, що спричинило збій сценарію від Kyle. Додавання -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/"

1
Чи є спосіб, щоб компілятор не скаржився? Я отримую "Command / bin / sh помилки, але не повернув ненульовий код виходу, щоб вказати на невдачу"
Chris Paveglio

Як альтернативу, дивіться цей коментар вище
chunkyguy

4

Якщо ви не хочете налаштувати налаштування, ще один простий домашній засіб - приклеїти заповнювач редактора перед коментарем:

<#todo#>// stop and fixme!

Ви отримуєте помилку "Редактор заповнювача у вихідному файлі" під час створення, але на відміну від рішення Джордана, немає живої помилки, яка б вас дратувала під час введення тексту:

заповнювач редактора


Хороша ідея - але чи не ідея кинути попередження, а не помилка? Це не дозволить вам будувати, поки ви не видалите його, що у багатьох (більшості?) Випадках точно не те, що ви хочете. Тодо і знаки виправлення іноді передбачають роботу, що тижнями вартує - я б уявив, що ви хочете створити та запустити свій проект за цей час :)
Джордан Сміт,

Звичайно, це хороший момент. Цей підхід корисний лише для більш нагальних завдань, які повинні відбутися перед тим, як зробити або навіть запустити додаток. Основна перевага полягає в тому, що виділення синтаксису та інші приємності редактора продовжують працювати, незважаючи на наявність цього заповнювача. Я сам використовую деякі інші підходи, включаючи ваш, але місця заповнення іноді корисні при багатозадачності. Він підходить для тих же випадків використання, що і вставки Xcode-заповнювачів при автоматичному завершенні виклику функції.
Minh Nguyễn

3

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

На відміну від цього, я настійно рекомендую подати Радар з Apple на bugreport.apple.com, щоб додати цю функціональність (можна обійтись 17702491).


1
Я зробив свою участь: rdar: // 19005171
David H

1
Також заповнено радаром
HixField

2

Ми написали інструмент, що налаштовується, що дозволяє встановлювати попередження та помилки в Навігаторі Xcode Issue на основі тегу коментарів та конфігурації збірки: 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/"

Ось стаття, що описує, як ми ним користуємося.


2

Я можу запізнитися на вечірку з Xcode 10, що підтримує помилки та попередження, але просто розміщую String:

"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

Перевага цього фрагмента - він не показує попередження від Pods:

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

Як встановити:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.