Swift: #warning äquivalent

192

Hat Swift ein #warning-Äquivalent? Es wird einfach verwendet, um eine Warnung in der Xcode-eigenen GUI anzuzeigen

Ich bin auch daran interessiert, ob es ein # Fehler-Äquivalent gibt.

Apple hat gesagt, dass die # Pragma-Marke bald kommt, dies könnte möglicherweise auch so sein.

Geben Sie hier die Bildbeschreibung ein

Irgendein Typ
quelle
7
Ich //WARNINGgehe davon aus, dass es genauso sein wird wie #pragma, //MARKaber derzeit wird keines von beiden zur XCode-Beta hinzugefügt.
Lord Zsolt
1
Ich würde dringend empfehlen, ein Radar einzureichen, um nach // WARNING
Pixel
@ Pixel Ich habe gerade ein Radar eingereicht
SomeGuy
Können Sie die Antwort von Jordan Smith akzeptieren? Dies ist jetzt in Swift als #warning
Bill

Antworten:

157

In Zukunft werden Apple-Entwickler möglicherweise einen //WARNING:Orientierungspunkt veröffentlichen oder die Funktionalität für einen anderen benannten Orientierungspunkt bereitstellen.

Um diese Funktionalität heute mit Swift in Xcode aufzurufen, können Sie jedoch die folgenden Schritte ausführen, wie von Ben Dodson & Jeffrey Sambells beschrieben:

Fügen Sie der Registerkarte "Erstellungsphasen" Ihres Ziels ein neues Ausführungsskript hinzu (Projekteinstellungen> Erstellungsphasen> '+'> Neue Ausführungsskriptphase) und fügen Sie den folgenden Code in das leere Feld ein:

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

Dadurch wird Xcode gezwungen, beim Kompilieren eine Warnung für alle // TODO:oder von // FIXME:Ihnen markierten Kommentare zu kennzeichnen.

Alternativ können Sie TAGS mit einem benutzerdefinierten Tag ändern: TAGS="WARNING:"im obigen Code, der das Standardverhalten für TODO & FIXME beibehält und eine Warnung zur Kompilierungszeit für alle Kommentare auslöst, die als gekennzeichnet sind // WARNING:.

http://bendodson.com/weblog/2014/10/02/showing-todo-as-warning-in-swift-xcode-project/ http://jeffreysambells.com/2013/01/31/generate-xcode- Warnungen von Aufgabenkommentaren

EDIT: 18/11/14

@ David-h hat in seinem Kommentar einen guten Punkt angesprochen. Wenn Sie diese Warnungen nur in einer bestimmten Build-Konfiguration auslösen möchten, können Sie Folgendes tun:

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

Alternativ können Sie "Release" anstelle von "Debug" verwenden, um nur auf Produktions-Builds abzuzielen.

Kyle G.
quelle
Dies ist eine sehr schöne vorübergehende Lösung, bis Apple sie behebt :)
SomeGuy
Das Problem dabei ist, dass meine App zwei Modi hat - Entwicklung und Produktion. Ich möchte wissen, dass es in der Produktion sauber aufgebaut wird, aber ich erhalte eine Warnung in der Entwicklung, die mich im Wesentlichen daran erinnert, dass ich mich im Entwicklungsmodus befinde - unter Verwendung verschiedener URLs, Zeitüberschreitungen, anderer Einstellungen usw. Mit dem obigen Vorschlag von Arie kann ich dies tun, Ihre Technik nur kennzeichnet alles. Das heißt, diese Technik hat sicher ihre Verwendung, also habe ich sie auch gewählt!
David H
Was für eine nützliche Idee! Vielen Dank, dass Sie diese nützlichen Informationen weitergegeben haben.
Tommy
@kyle Könnten Sie mir bitte die Bedeutung von perl -p -e "s / ($ TAGS) / warning mitteilen: \ $ 1 /" diese Zeile
Rocker
3
Funktioniert hervorragend, aber ich musste -type fdem findBefehl die Option hinzufügen , um Verzeichnisse von den Suchergebnissen auszuschließen. Dies sollte für die meisten Menschen kein Problem sein, aber jeder, der den R.swiftPod verwendet, wird auf den gleichen Fehler stoßen, den ich hatte, weil R.swiftes sich um ein Verzeichnis handelt
Dan F
156

Bearbeiten

Ab Swift 4.2 ist die Unterstützung auf Sprachebene sowohl für Build-Warnungen als auch für Fehler verfügbar.

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

Ursprüngliche Antwort

Schnell, schmutzig und ach so elegant einfach zugleich.

// Description of what you need to fix

var FIX_ME__🛠🛠🛠: AnyObject

Wirft eine Warnung aus, dass 'FIX_ME__🛠🛠🛠' nie verwendet wurde.

Sie können dem Variablennamen Emoticons hinzufügen, wenn Sie möchten ... Ich verwende oft 😱 und 🛠 für etwas, das wirklich repariert werden muss, was ich sogar in Betracht ziehen würde 💩. Sie können ersetzen FIX_ME__mit dem, was Sie wollen: ALGORITHM_NEEDS_REVIEW, BugID_148oder JOHNNY_YOU_BROKE_THISsind einige Beispiele.

Schnell, ohne Setup, präzise und Emoticons können Sie Ihrem Code sogar Humor / Persönlichkeit verleihen. Manchmal ist die einfachste Lösung die beste Lösung.

Jordan Smith
quelle
6
... Warum alle Abstimmungen? Dies funktioniert genauso gut wie jede andere Methode hier. Wenn Sie nicht abstimmen, geben Sie zumindest einen Grund an, vielleicht war ich nicht klar genug oder es stimmt etwas nicht mit dem, was ich tue. Ich würde gerne wissen, ob es welche gibt.
Jordan Smith
16
Ja, ich bin mir nicht sicher, warum dies nicht mehr positiv bewertet wird. Alle anderen Lösungen sind viel zu kompliziert.
Simone Manganelli
3
@ZaEeMZaFaR der Compiler würde es sehr wahrscheinlich loswerden. Außerdem werden diese Probleme in den meisten Fällen vor der Veröffentlichung behoben. Und - selbst wenn der Compiler aus irgendeinem Grund nicht klug genug ist, um ihn loszuwerden (ich halte dies für sehr unwahrscheinlich) - 100 Int-Variablen im Speicher sind 6,4 KB Speicher - im Grunde nichts. Ich glaube nicht, dass Sie einen gültigen Punkt haben, sorry.
Jordan Smith
4
Ich habe die anderen benutzt, aber auf diese umgestellt. Es ist das einfachste und Sie können sich sogar eine kleine Nachricht geben, die in der Warnung angezeigt wird, dh: let fixMeMakeMeNonOptional: IntSie werden Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it im Issue-Navigator angezeigt. Alle anderen Lösungen geben Ihnen viel allgemeinere Fehlermeldungen.
Nathan Perry
1
@ NathanPerry ja, stimmte zu. Das Einrichten einer komplexen Sache ist nicht immer eine Option, insbesondere wenn Sie in einem Team oder an mehreren Projekten usw. arbeiten. Außerdem sind einfache Lösungen immer die besten. Ich habe die Nachricht derzeit nur in einem Kommentar daneben gestellt, aber was Sie tun, ist auch keine schlechte Idee.
Jordan Smith
81

Post WWDC 2018 Update

Ab Xcode 10 und Swift 4.2 können Sie nun #warningwie folgt wieder verwenden:

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

Dies wird wie erwartet als Warnung in Xcode angezeigt!

Dies funktioniert auch in Kombination mit #ifÜberprüfungen. Im Folgenden wird beispielsweise nur dann eine Warnung angezeigt, wenn Ihre Zielplattform iOS ist:

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

Es gibt auch, #errorwenn Sie möchten, dass Ihr Build fehlschlägt.


Antwort vor WWDC 2018

In Swift mit XCode 6 können Sie verschiedene Arten von Orientierungspunkten für verschiedene Zwecke verwenden. Folgendes sagt Apple dazu:

Xcode unterstützt jetzt // MARK:, // TODO: und // FIXME: Orientierungspunkte , um Ihren Code zu kommentieren und in der Sprungleiste aufzulisten .

Zum Setzen einer Warnung mit einer Beschreibung würden Sie also Folgendes verwenden:

//TODO: Clean up this code after testing

Wenn Sie nur eine kurze Markierung setzen möchten (vorausgesetzt, Sie werden sich daran erinnern, was zu tun ist), verwenden Sie Folgendes:

//FIXME

BEARBEITEN: Diese Orientierungspunkte werden jedoch nur in der Sprungleiste von XCode angezeigt. Dies ist möglicherweise nicht das, was Sie sich wünschen und was Sie erwarten würden - insbesondere von den Markierungen // TODO: und // FIXME. Ich habe ein Radar dazu eingereicht: # 17776817. Hoffentlich wird Apple dies in den kommenden Builds in XCode 6 hinzufügen.

LÖSUNG (BEARBEITEN 2): Wenn Sie den Swift Linter über Homebrew installieren ( brew install swiftlintnach a ausführen brew update) und das vorgeschlagene Build-Skript zu Ihrem Projekt hinzufügen , werden alle Ihre TODOund FIXMEOrientierungspunkte als Warnungen in Xcode angezeigt. SwiftLint fügt sogar einige weitere Warnungen / Fehler hinzu, die Sie entsprechend Ihren Anforderungen konfigurieren können. Ich kann die Verwendung von SwiftLint nur empfehlen und es löst dieses Problem auf großartige Weise!

Jeehut
quelle
7
Leider werden diese beim Kompilieren Ihrer App nicht im Warnfenster angezeigt. Ich warte immer noch auf einen, der wie ein schmerzender Daumen hervorsteht, damit Sie ihn wahrscheinlich nicht vergessen. Diese werden nur in der Sprungleiste angezeigt und Sie müssen daran denken, Ihr Projekt nach "// TODO" zu durchsuchen, um es zu finden. Oder wenn jemand weiß, wie man sie für das gesamte Projekt sieht, lass es mich wissen. - Zeit für ein anderes Radar :)
SomeGuy
1
Äh ja, du hast recht. Ich dachte, die Sprungleiste ist die Seitenleiste links und diese Markierungen würden im Issue Navigator angezeigt, aber das tun sie nicht. Ich habe gerade ein Radar dazu eingereicht: # 17776817. :)
Jeehut
@SomeGuy Was meinst du damit, dass sie in der Sprungleiste angezeigt werden? Soweit ich sehen kann, befinden sie sich nicht in der Leiste, die sich oben im Editorfenster in Xcode befindet. Die einzige Möglichkeit, sie (für mich) zu bemerken, scheint darin zu bestehen, mit Befehl + F nach ihnen zu suchen. Wo werden die Orientierungspunkte angezeigt?
Almel
2
@almel Die Sprungleiste ist das Dropdown-Menü oben in einer Datei. Sie enthält eine Liste der Funktionen in der aktuellen Datei i.cubeupload.com/jLRwTs.png
SomeGuy
55

Noch nicht vom Apple-Team hinzugefügt. Was ich beschlossen habe, ist wahrscheinlich ein Betrug, aber zumindest zeigt es mir eine FIXME-Nachricht. Ich deklariere also die Funktion FIXME () in der Swift-Datei:

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

und wenn ich es von einer anderen Funktion aus aufrufe, wird eine Warnung angezeigt, z

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

Geben Sie hier die Bildbeschreibung ein

Für Swift 2 verwenden

@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
unterbrechen
quelle
2
Nur zur Veranschaulichung: @availability wurde in Swift 2 in "@available" umbenannt.
Tobias
42

Schauen Sie sich diesen Artikel an .

Sie können Ihr eigenes Skript schreiben, das alle Tags hervorhebt.

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

Dies führt zu: Geben Sie hier die Bildbeschreibung ein

kelin
quelle
Hinzufügen egrep --directories='skip', um Verzeichnisse mit Namen wie Device.swift
chunkyguy
12

Wenn Sie alternativ möchten, dass etwas im Warnfenster angezeigt wird, können Sie Folgendes schreiben:

if (false){
   var x = 2;
}

Sie können nicht wirklich Text anzeigen lassen, aber es ist zumindest eine sichtbarere Markierung, insbesondere wenn Sie dazu neigen, (die meisten) Warnungen wie Fehler zu behandeln.

Arie Litovsky
quelle
11
Oder einfach tun, wenn falsch {"die Warnmeldung"}
Bao Lei
Diese Lösung ist schrecklich. Scheint aber das beste zu sein. Abgestimmt, danke.
Skagedal
6

Ich habe diese Funktion vorgeschlagen und implementiert und sie wird mit Swift 4.2 ausgeliefert. Sie können es jetzt verwenden, indem Sie die masterToolchain auf swift.org herunterladen .

#if os(macOS)
  #error("macOS is not supported")
#endif
#warning("finish this")
Harlan Haskins
quelle
5

Ein CocoaPod, den ich verwendete, hatte .swiftseinen Namen, daher wurde ein Verzeichnis zurückgegeben, das das Skript von Kyle zum Absturz brachte. Das Hinzufügen -type fzum findBefehl behebt dieses Problem, indem nur übereinstimmende Dateien angezeigt werden, *.swiftanstatt auch Verzeichnisse zurückzugeben, die dem Muster entsprechen.

Letzter Code, den ich verwendet habe:

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
quelle
1
Gibt es eine Möglichkeit, den Compiler nicht beschweren zu lassen? Ich erhalte "Command / bin / sh hat Fehler
ausgegeben
Als Alternative siehe diesen Kommentar oben
Chunkyguy
4

Wenn Sie Ihr Build-Setup nicht anpassen möchten, können Sie auch einen Platzhalter für den Editor vor den Kommentar setzen:

<#todo#>// stop and fixme!

Beim Erstellen wird der Fehler "Editor-Platzhalter in Quelldatei" angezeigt. Im Gegensatz zu Jordans Lösung gibt es jedoch keinen Live-Fehler, der Sie beim Tippen stört:

Platzhalter des Editors

Minh Nguyễn
quelle
Gute Idee - aber ist es nicht die Idee, eine Warnung und keinen Fehler zu werfen? Wenn Sie dies tun, können Sie erst dann erstellen, wenn Sie es entfernen, was in vielen (den meisten?) Fällen definitiv nicht das ist, was Sie wollen. Todo und Fixme Marks erfordern manchmal Wochen Arbeit - ich würde mir vorstellen, dass Sie Ihr Projekt in dieser Zeit erstellen und ausführen möchten :)
Jordan Smith
Klar, das ist ein guter Punkt. Dieser Ansatz ist nur für dringendere Aufgaben nützlich, die vor dem Festschreiben oder Ausführen der Anwendung ausgeführt werden müssen. Der Hauptvorteil besteht darin, dass die Syntaxhervorhebung und andere Editor-Feinheiten trotz des Vorhandenseins dieses Platzhalters weiterhin funktionieren. Ich verwende hier selbst einige der anderen Ansätze, einschließlich Ihrer, aber die Platzhalter sind manchmal beim Multitasking hilfreich. Es passt zu denselben Anwendungsfällen wie die Platzhalter, die Xcode beim automatischen Vervollständigen eines Funktionsaufrufs einfügt.
Minh Nguyễn
3

Nach langem Suchen und Sehnsucht bin ich überzeugt, dass es keine solche Einheit gibt. Ich bin immer noch zuversichtlich, dass die neuesten Xcode-Versionshinweise das anhaltende Fehlen eines # Pragma-Markierungsmechanismus erwähnen. Möglicherweise kommen auch #Warnung und #Fehler hinzu.

Abgesehen davon empfehle ich dringend, ein Radar bei Apple unter bugreport.apple.com einzureichen , um diese Funktionalität hinzuzufügen (Sie können 17702491 betrügen).

rcw3
quelle
1
Ich habe meinen Teil getan: rdar: // 19005171
David H
1
Auch in ein Radar gefüllt
HixField
2

Wir haben ein konfigurierbares Tool geschrieben, mit dem Sie Warnungen und Fehler in Xcode Issue Navigator basierend auf dem Kommentar-Tag und der Build-Konfiguration einfügen können : https://github.com/doubleencore/XcodeIssueGenerator

Es installieren:

brew tap doubleencore/tap
brew install xcodeissuegenerator

Fügen Sie dann eine Zeile in eine Run Script Build-Phase ein:

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

Hier ist ein Artikel, der beschreibt, wie wir es verwenden.

soolwan
quelle
2

Ich komme möglicherweise zu spät zur Party, da Xcode 10 Fehler und Warnungen unterstützt, aber einfach einen String eingefügt:

"Need to finish implementing this"

wird eine Warnung String literal is unusedausgeben : Die automatische Vervollständigung funktioniert noch und das Projekt wird noch kompiliert.

Przemysław Wrzesiński
quelle
1

Meine Antwort ist nicht ganz zufrieden mit Ihrer Frage, aber wenn Sie etwas Einfaches wollen, können Sie dieses Plugin von alcatraz verwenden, das in allen Projekten ohne zusätzliche Vorbereitungen funktioniert. Gehen Sie einfach wie folgt vor:

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

Es gibt auch Einstellungen zum Hinzufügen neuer Tags

Geben Sie hier die Bildbeschreibung ein

Nikolay Shubenkov
quelle
1

Vorteil dieses Snippets - es werden keine Warnungen von Pods angezeigt:

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

Wie installiert man:

Geben Sie hier die Bildbeschreibung ein

Igor
quelle