Swift: # odpowiednik ostrzeżenia

192

Czy Swift ma odpowiednik #warning? Jest po prostu używany do wyświetlania ostrzeżenia we własnym GUI Xcode

Interesuje mnie również, czy istnieje odpowiednik #error.

Apple powiedziało, że wkrótce pojawi się znak #pragma, może być tak samo z tym.

wprowadź opis zdjęcia tutaj

Jakiś facet
źródło
7
Zakładam, że będzie //WARNINGtak jak #pragma, //MARKale obecnie żadne z nich nie jest dodawane do XCode beta.
Lord Zsolt
1
Zdecydowanie sugerowałbym złożenie radaru z prośbą o // OSTRZEŻENIE
piksel
@pixel Właśnie
zapisałem
Czy możesz zaakceptować odpowiedź Jordana Smitha? Jest to teraz wbudowane w Swift jako #warning
Bill

Odpowiedzi:

157

W przyszłości deweloperzy Apple mogą bardzo dobrze wydać //WARNING:punkt orientacyjny lub zapewnić funkcjonalność dla innego nazwanego punktu orientacyjnego.

Aby jednak przywołać tę funkcjonalność za pomocą Swift w Xcode, możesz wykonać następujące czynności opisane przez Bena Dodsona i Jeffreya Sambellsa:

Dodaj nowy skrypt uruchamiania do zakładki faz kompilacji celu (ustawienia projektu> fazy kompilacji> „+”> nowa faza skryptu uruchamiania) i wklej następujący kod w pustym polu:

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

Zmusi to Xcode do oznaczenia ostrzeżenia w czasie kompilacji dla dowolnego znacznika // TODO:lub // FIXME:komentarzy.

Alternatywnie, możesz zmienić TAGI za pomocą niestandardowego znacznika: TAGS="WARNING:"w powyższym kodzie, który zachowałby domyślne zachowanie dla TODO i FIXME i podniósłby ostrzeżenie o czasie kompilacji w przypadku wszelkich komentarzy oznaczonych jako // WARNING:.

http://bendodson.com/weblog/2014/10/02/showing-todo-as-warning-in-swift-xcode-project/ http://jeffreysambells.com/2013/01/31/generate-xcode- ostrzeżenia-od-todo-komentarzy

EDYCJA: 18/11/14

@ David-h podniósł dobry punkt w swoim komentarzu. Jeśli chcesz wyświetlać te ostrzeżenia tylko w określonej konfiguracji kompilacji, możesz wykonać następujące czynności:

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

Alternatywnie możesz użyć „Release” zamiast „Debuguj” tylko w celu kierowania na kompilacje produkcyjne.

Kyle G.
źródło
Jest to bardzo miłe tymczasowe rozwiązanie, dopóki Apple go nie naprawi :)
SomeGuy
Problem polega na tym, że moja aplikacja ma dwa tryby - programistyczny i produkcyjny. Chcę wiedzieć, że buduje się w środowisku produkcyjnym w czystości, ale w trakcie tworzenia pojawia się ostrzeżenie, które zasadniczo przypomina mi, że jestem w trybie deweloperskim - używając różnych adresów URL, limitów czasu, innych ustawień itp. Powyższa sugestia Arie pozwala mi to zrobić, twoja technika po prostu zaznacza wszystko. To powiedziawszy, ta technika na pewno ma zastosowanie, więc też ją głosowałem!
David H
Co za przydatny pomysł! Dziękujemy za podzielenie się tą przydatną informacją.
Tommy
@kyle Czy mógłbyś podać znaczenie perla -p -e "s / ($ TAGS) / warning: \ $ 1 /" ten wiersz
Rocker
3
Działa świetnie, jednak musiałem dodać -type fopcję do findpolecenia, aby wykluczyć katalogi z wyników wyszukiwania. Nie powinno to stanowić problemu dla większości ludzi, ale każdy, kto korzysta z R.swiftzasobnika, napotka ten sam błąd, który miałem, ponieważ R.swiftjest to katalog
Dan F
156

Edytować

Począwszy od wersji Swift 4.2, obsługa poziomu języka jest dostępna zarówno dla ostrzeżeń kompilacji, jak i błędów.

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

Oryginalna odpowiedź

Szybkie, brudne i och, tak elegancko proste w tym samym czasie.

// Description of what you need to fix

var FIX_ME__🛠🛠🛠: AnyObject

Zgłasza ostrzeżenie, że „FIX_ME__🛠🛠🛠” nigdy nie był używany.

Możesz dodać emotikony do nazwy zmiennej, jeśli chcesz ... Często używam 😱 i 🛠, dla czegoś, co naprawdę wymaga naprawy, nawet bym wziął pod uwagę 💩. Można wymienić FIX_ME__z cokolwiek chcesz: ALGORITHM_NEEDS_REVIEW, BugID_148lub JOHNNY_YOU_BROKE_THISkilka przykładów.

Szybkie, brak konfiguracji, zwięzłe i emotikony mogą nawet dodać humorowi / osobowości do twojego kodu. Czasami najprostsze rozwiązanie jest najlepszym rozwiązaniem.

Jordan Smith
źródło
6
... Skąd te wszystkie głosy? Działa to tak samo dobrze, jak każda inna metoda tutaj. Jeśli głosujesz w dół, przynajmniej podaj powód, może nie byłem wystarczająco jasny lub coś jest nie tak z tym, co robię. Chciałbym wiedzieć, czy jest.
Jordan Smith
16
Tak, nie jestem pewien, dlaczego nie jest to bardziej uprzywilejowane. Wszystkie pozostałe rozwiązania są zbyt skomplikowane.
Simone Manganelli
3
@ZaEeMZaFaR kompilator najprawdopodobniej się go pozbędzie. Poza tym w większości przypadków problemy te zostaną naprawione przed wydaniem. I - nawet jeśli z jakiegokolwiek powodu kompilator nie jest wystarczająco inteligentny, aby się go pozbyć (myślę, że jest to bardzo mało prawdopodobne) - 100 Int warów w pamięci to 6,4kb pamięci - w zasadzie nic. Nie sądzę, żebyś miał rację, przepraszam.
Jordan Smith
4
Użyłem innych, ale przełączyłem się na korzystanie z tego. Jest to najprostsze i możesz nawet dać sobie małą wiadomość, która pojawi się w ostrzeżeniu, tj .: let fixMeMakeMeNonOptional: Intdaje ci Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it w nawigatorze problemów. Wszystkie pozostałe rozwiązania dają znacznie bardziej ogólne komunikaty o błędach.
Nathan Perry,
1
@NathanPerry tak, zgodził się. Przygotowanie jakiejś złożonej rzeczy nie zawsze jest opcją, szczególnie gdy pracujesz w zespole lub przy wielu projektach itp. Ponadto proste rozwiązania są zawsze najlepsze. Obecnie po prostu umieszczam wiadomość w komentarzu, ale to, co robisz, nie jest złym pomysłem.
Jordan Smith
81

Aktualizacja po WWDC 2018

Począwszy od Xcode 10 i Swift 4.2, będziesz mógł teraz używać #warningponownie w następujący sposób:

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

Będzie to wyświetlane jako ostrzeżenie w Xcode zgodnie z oczekiwaniami!

Działa to nawet w połączeniu z #ifczekami, na przykład poniższe ostrzeżenie wyświetli ostrzeżenie tylko, jeśli twoją platformą docelową jest iOS:

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

Jest również, #errorjeśli chcesz, aby kompilacja się nie powiodła.


Odpowiedź sprzed WWDC 2018

W Swift za pomocą XCode 6 możesz używać różnego rodzaju punktów orientacyjnych do różnych celów. Oto, co mówi o tym Apple:

Xcode obsługuje teraz punkty orientacyjne // MARK :, // TODO: i // FIXME: do dodawania adnotacji do kodu i umieszczania ich na pasku skoku.

Aby ustawić ostrzeżenie z opisem, użyj czegoś takiego:

//TODO: Clean up this code after testing

Jeśli chcesz tylko ustawić krótki znak (zakładając, że będziesz pamiętać, co robić), użyj tego:

//FIXME

EDYCJA: Te punkty orientacyjne pojawiają się jednak tylko na pasku skoku XCode, co może nie być tym, czego chcesz i czego można się spodziewać - szczególnie po znakach // TODO: i // FIXME. Zapisałem radar na ten temat: # 17776817. Mam nadzieję, że Apple doda to w nadchodzących wersjach XCode 6.

ROZWIĄZANIE (EDYCJA 2): Jeśli zainstalujesz Swift Linter przez Homebrew (uruchom brew install swiftlintpo a brew update) i dodasz sugerowany skrypt kompilacji do swojego projektu, wtedy zobaczysz wszystkie twoje TODOi FIXMEpunkty orientacyjne jako ostrzeżenia w Xcode. SwiftLint doda nawet więcej ostrzeżeń / błędów, które możesz skonfigurować w celu dopasowania do swoich potrzeb - mogę jedynie polecić użycie SwiftLint i to rozwiązuje ten problem w świetny sposób!

Jeehut
źródło
7
Niestety nie pojawiają się one w panelu ostrzeżeń podczas kompilowania aplikacji. Nadal czekam na taki, który wystaje jak obolały kciuk, więc prawdopodobnie nie zapomnisz o nich. Te po prostu pojawiają się na pasku zadań i musisz pamiętać, aby wyszukać projekt w poszukiwaniu „// TODO”, aby go znaleźć. Lub jeśli ktoś wie, jak je zobaczyć dla całego projektu, daj mi znać. - czas na kolejny Radar :)
SomeGuy
1
Tak, masz rację. Myślałem, że pasek skoku to pasek boczny po lewej stronie i że te znaki pojawią się w programie Issue Navigator, ale tak nie jest. Właśnie zapisałem radar na ten temat: # 17776817. :)
Jeehut,
@SomeGuy Co masz na myśli, mówiąc, że pojawiają się na pasku? Z tego, co widzę, nie ma ich gdzie indziej na pasku, który znajduje się w górnej części okna edytora w Xcode. Jedynym sposobem na ich zauważenie (dla mnie) wydaje się poszukiwanie ich za pomocą Command + F. Gdzie są wyświetlane punkty orientacyjne?
almel
2
@almel Pasek przewijania jest rozwijany w górnej części pliku, daje listę funkcji w bieżącym pliku i.cubeupload.com/jLRwTs.png
SomeGuy
55

Zespół Apple jeszcze nie dodał. To, co postanowiłem zrobić, to prawdopodobnie oszustwo, ale przynajmniej pokazuje mi komunikat FIXME. Więc zadeklarowałem funkcję FIXME () w pliku Swift:

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

a kiedy wywołuję to z dowolnej innej funkcji, wyświetla ostrzeżenie, np

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

wprowadź opis zdjęcia tutaj

Do użytku w Swift 2

@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
przerwać
źródło
2
Dla przypomnienia: nazwa @availability została zmieniona na „@available” w swift 2.
Tobias
42

Spójrz na ten artykuł .

Możesz napisać własny skrypt, który podświetli wszystkie tagi.

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

To powoduje: wprowadź opis zdjęcia tutaj

Kelin
źródło
Dodaj, egrep --directories='skip'aby zignorować katalogi o nazwach takich jak Device.swift
chunkyguy
12

Alternatywnie, jeśli chcesz pokazać coś w panelu ostrzeżeń, możesz napisać coś takiego:

if (false){
   var x = 2;
}

Tak naprawdę nie można wyświetlić żadnego tekstu, ale przynajmniej jest to bardziej widoczny znacznik, zwłaszcza jeśli traktujesz (większość) ostrzeżeń jak błędy.

Arie Litowski
źródło
11
Albo po prostu zrób, jeśli fałsz {„komunikat ostrzegawczy”}
Bao Lei
To rozwiązanie jest okropne. Ale wydaje się być najlepszym dostępnym. Zagłosowano, dziękuję.
skagedal
6

I zaproponował i wdrożone tej funkcji, i będzie dostarczany z Swifta 4.2. Możesz go teraz użyć, pobierając zestawmaster narzędzi na swift.org .

#if os(macOS)
  #error("macOS is not supported")
#endif
#warning("finish this")
Harlan Haskins
źródło
5

Jeden CocoaPod, którego używałem, miał .swiftw swojej nazwie, więc został zwrócony katalog, co spowodowało awarię skryptu Kyle'a. Dodanie -type fdo findpolecenia rozwiązuje ten problem, patrząc tylko na pliki, które pasują, *.swiftzamiast zwracać katalogi pasujące do wzorca.

Ostateczny kod, którego użyłem:

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
źródło
1
Czy istnieje sposób, aby kompilator nie narzekał?
Pojawia się komunikat
Jako alternatywę zobaczyć ten komentarz powyżej
chunkyguy
4

Jeśli nie chcesz zmieniać konfiguracji kompilacji, innym prostym rozwiązaniem domowym jest przyklejenie symbolu zastępczego edytora przed komentarzem:

<#todo#>// stop and fixme!

Podczas kompilacji pojawia się błąd „Symbol zastępczy edytora w pliku źródłowym”, ale w przeciwieństwie do rozwiązania Jordana, nie ma żadnego błędu na żywo, który by cię denerwował podczas pisania:

symbol zastępczy edytora

Minh Nguyễn
źródło
Fajny pomysł - ale czy nie jest to pomysł ostrzeżenia, a nie błędu? Wykonanie tego nie pozwoli Ci budować, dopóki go nie usuniesz, co w wielu (większości?) Przypadkach zdecydowanie nie jest tym, czego chcesz. Oceny Todo i fixme czasami wymagają tygodni pracy - wyobrażam sobie, że w tym czasie chciałbyś zbudować i uruchomić swój projekt :)
Jordan Smith
Jasne, to dobra uwaga. Takie podejście jest przydatne tylko w przypadku pilniejszych czynności do wykonania, które muszą się wydarzyć przed zatwierdzeniem lub uruchomieniem aplikacji. Główną zaletą jest to, że podświetlanie składni i inne elementy edytora działają nadal pomimo obecności tego symbolu zastępczego. Sami używam tutaj innych podejść, w tym także twoich, ale symbole zastępcze są czasem pomocne podczas wielozadaniowości. Pasuje do tych samych przypadków użycia, które wstawia symbole zastępcze Xcode podczas autouzupełniania wywołania funkcji.
Minh Nguyễn
3

Po wielu poszukiwaniach i tęsknocie jestem przekonany, że taki byt nie istnieje. Nadal mam nadzieję, że najnowsze informacje o wydaniu Xcode wspominają o dalszym braku mechanizmu znaku #pragma, #warning i #error również mogą się zbliżać.

Na marginesie, bardzo polecam złożenie radaru w Apple na stronie bugreport.apple.com, aby dodać tę funkcjonalność (możesz skopiować 17702491).

rcw3
źródło
1
Zrobiłem część: rdar: // 19005171
David H
1
Wypełniono również radar
HixField
2

Napisaliśmy konfigurowalne narzędzie, które pozwala umieszczać ostrzeżenia i błędy w Xcode Issue Navigator w oparciu o tag komentarza i konfigurację kompilacji: https://github.com/doubleencore/XcodeIssueGenerator

Zainstaluj to:

brew tap doubleencore/tap
brew install xcodeissuegenerator

Następnie wstaw wiersz w fazie kompilacji skryptu uruchamiania:

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

Oto artykuł opisujący, w jaki sposób go wykorzystujemy.

soolwan
źródło
2

Mogę się spóźnić na imprezę z Xcode 10 obsługującym błędy i ostrzeżenia, ale po prostu wstawiając ciąg:

"Need to finish implementing this"

wyświetli ostrzeżenie: String literal is unusedz autouzupełnianiem nadal działa, a projekt nadal się kompiluje.

Przemysław Wrzesiński
źródło
1

Moja odpowiedź nie do końca spełnia twoje pytanie, ale jeśli chcesz czegoś łatwego, możesz użyć tej wtyczki alcatraz, która działa we wszystkich projektach bez żadnych dodatkowych przygotowań. Po prostu wykonaj następujące czynności:

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

Ma również preferencje dotyczące dodawania nowych tagów

wprowadź opis zdjęcia tutaj

Nikolay Shubenkov
źródło
1

Zaletą tego fragmentu - nie wyświetla ostrzeżeń od 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

Jak zainstalować:

wprowadź opis zdjęcia tutaj

Igor
źródło