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:
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:.
@ 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.
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 fixvar 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.
... 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!
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
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.
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.
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:
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).
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:
#MarkWARNINGs,SERIOUSs, and TODOsas warnings in DEBUG builds excluding the Vendor and ThirdParty directories.XcodeIssueGenerator-b DEBUG -w "WARNING, SERIOUS, TODO"-x "Vendor/, Third Party/"
Oto artykuł opisujący, w jaki sposób go wykorzystujemy.
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 forXcodePlug-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 inXcode3)InXcode select menu item ->Window->Package manager -> type in search panel XTodo and press install
4)RelaunchXcode and again agree to install additional bundles
5)From now press Ctrl+ T and you will see all Tagsin nice window
Ma również preferencje dotyczące dodawania nowych tagów
//WARNING
tak jak #pragma,//MARK
ale obecnie żadne z nich nie jest dodawane do XCode beta.Odpowiedzi:
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:
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:
Alternatywnie możesz użyć „Release” zamiast „Debuguj” tylko w celu kierowania na kompilacje produkcyjne.
źródło
-type f
opcję dofind
polecenia, aby wykluczyć katalogi z wyników wyszukiwania. Nie powinno to stanowić problemu dla większości ludzi, ale każdy, kto korzysta zR.swift
zasobnika, napotka ten sam błąd, który miałem, ponieważR.swift
jest to katalogEdytować
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.
Oryginalna odpowiedź
Szybkie, brudne i och, tak elegancko proste w tym samym czasie.
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_148
lubJOHNNY_YOU_BROKE_THIS
kilka 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.
źródło
let fixMeMakeMeNonOptional: Int
daje ciImmutable 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.Aktualizacja po WWDC 2018
Począwszy od Xcode 10 i Swift 4.2, będziesz mógł teraz używać
#warning
ponownie w następujący sposób:Będzie to wyświetlane jako ostrzeżenie w Xcode zgodnie z oczekiwaniami!
Działa to nawet w połączeniu z
#if
czekami, na przykład poniższe ostrzeżenie wyświetli ostrzeżenie tylko, jeśli twoją platformą docelową jest iOS:Jest również,
#error
jeś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:
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 swiftlint
po abrew update
) i dodasz sugerowany skrypt kompilacji do swojego projektu, wtedy zobaczysz wszystkie twojeTODO
iFIXME
punkty 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!źródło
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:
a kiedy wywołuję to z dowolnej innej funkcji, wyświetla ostrzeżenie, np
Do użytku w Swift 2
źródło
Spójrz na ten artykuł .
Możesz napisać własny skrypt, który podświetli wszystkie tagi.
To powoduje:
źródło
egrep --directories='skip'
aby zignorować katalogi o nazwach takich jak Device.swiftAlternatywnie, jeśli chcesz pokazać coś w panelu ostrzeżeń, możesz napisać coś takiego:
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.
źródło
I zaproponował i wdrożone tej funkcji, i będzie dostarczany z Swifta 4.2. Możesz go teraz użyć, pobierając zestaw
master
narzędzi na swift.org .źródło
Jeden CocoaPod, którego używałem, miał
.swift
w swojej nazwie, więc został zwrócony katalog, co spowodowało awarię skryptu Kyle'a. Dodanie-type f
dofind
polecenia rozwiązuje ten problem, patrząc tylko na pliki, które pasują,*.swift
zamiast zwracać katalogi pasujące do wzorca.Ostateczny kod, którego użyłem:
źródło
Jeśli nie chcesz zmieniać konfiguracji kompilacji, innym prostym rozwiązaniem domowym jest przyklejenie symbolu zastępczego edytora przed komentarzem:
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:
źródło
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).
źródło
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:
Następnie wstaw wiersz w fazie kompilacji skryptu uruchamiania:
Oto artykuł opisujący, w jaki sposób go wykorzystujemy.
źródło
Mogę się spóźnić na imprezę z Xcode 10 obsługującym błędy i ostrzeżenia, ale po prostu wstawiając ciąg:
wyświetli ostrzeżenie:
String literal is unused
z autouzupełnianiem nadal działa, a projekt nadal się kompiluje.źródło
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:
Ma również preferencje dotyczące dodawania nowych tagów
źródło
Zaletą tego fragmentu - nie wyświetla ostrzeżeń od Pods:
Jak zainstalować:
źródło