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.
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.
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:
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.
-type f
opcję do find
polecenia, aby wykluczyć katalogi z wyników wyszukiwania. Nie powinno to stanowić problemu dla większości ludzi, ale każdy, kto korzysta z R.swift
zasobnika, napotka ten sam błąd, który miałem, ponieważ R.swift
jest to katalog
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_148
lub JOHNNY_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.
let fixMeMakeMeNonOptional: Int
daje 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.
Począwszy od Xcode 10 i Swift 4.2, będziesz mógł teraz używać #warning
ponownie 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 #if
czekami, 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ż, #error
jeśli chcesz, aby kompilacja się nie powiodła.
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 swiftlint
po a brew update
) i dodasz sugerowany skrypt kompilacji do swojego projektu, wtedy zobaczysz wszystkie twoje TODO
i FIXME
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!
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
}
Do użytku w Swift 2
@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
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/"
egrep --directories='skip'
aby zignorować katalogi o nazwach takich jak Device.swift
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.
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")
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
do find
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:
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/"
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:
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:
# 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.
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 unused
z autouzupełnianiem nadal działa, a projekt nadal się kompiluje.
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
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ć:
//WARNING
tak jak #pragma,//MARK
ale obecnie żadne z nich nie jest dodawane do XCode beta.