Swift: #warning equivalente


192

Swift ha un equivalente #warning? È semplicemente usato per mostrare un avviso nella GUI di Xcode

Mi interessa anche sapere se esiste un equivalente #error.

Apple ha detto che il marchio #pragma arriverà presto, potrebbe essere lo stesso con questo.

inserisci qui la descrizione dell'immagine


7
Presumo che sarà //WARNINGproprio come lo sarà #pragma //MARKma attualmente nessuno dei due viene aggiunto a XCode beta.
Lord Zsolt,

1
Consiglio vivamente di presentare un radar per chiedere // ATTENZIONE
pixel

@pixel Ho appena presentato un radar
SomeGuy

Riesci ad accettare la risposta di Jordan Smith? Questo è ora integrato in Swift come #warning
Bill

Risposte:


158

In futuro, gli sviluppatori Apple potrebbero benissimo rilasciare un //WARNING:punto di riferimento o fornire la funzionalità per un altro punto di riferimento denominato.

Tuttavia, per invocare questa funzionalità con Swift in Xcode oggi, puoi fare quanto indicato da Ben Dodson e Jeffrey Sambells:

Aggiungi un nuovo Run Script alla scheda delle fasi di build del tuo target (impostazioni del progetto> fasi di build> '+'> nuova fase dello script di esecuzione) e incolla il seguente codice nella casella vuota:

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

Ciò costringerà Xcode a contrassegnare un avviso in fase di compilazione per qualsiasi // TODO:o // FIXME:commento che markup.

In alternativa, è possibile modificare TAGS con un tag personalizzato: TAGS="WARNING:"nel codice sopra che manterrebbe il comportamento predefinito per TODO e FIXME e genererebbe un avviso di tempo di compilazione su tutti i commenti contrassegnati come // WARNING:.

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

MODIFICA: 18/11/14

@ David-H ha sollevato un buon punto nel suo commento. Se si desidera sollevare questi avvisi solo in una configurazione di build specifica, è possibile effettuare le seguenti operazioni:

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

In alternativa, è possibile utilizzare "Rilascio" anziché "Debug" solo per le build di produzione di destinazione.


Questa è una soluzione temporanea molto bella finché Apple non lo risolve :)
SomeGuy

Il problema è che la mia app ha due modalità: sviluppo e produzione. Voglio sapere che è pulito nella produzione, ma ricevo un avvertimento in fase di sviluppo che mi ricorda essenzialmente che sono in modalità dev - utilizzando URL, timeout, altre impostazioni diversi ecc. Il suggerimento di Arie sopra mi permette di fare questo, la tua tecnica solo segnala tutto. Detto questo, questa tecnica ha sicuramente il suo utilizzo, quindi ho votato anche io!
David H,

Che idea utile! Grazie per aver condiviso queste informazioni utili.
Tommy,

@kyle Potresti per favore farmi sapere il significato di perl -p -e "s / ($ TAGS) / warning: \ $ 1 /" questa linea
Rocker

3
Funziona benissimo, tuttavia ho dovuto aggiungere l' -type fopzione al findcomando per escludere le directory dai risultati di ricerca. Questo non dovrebbe essere un problema per la maggior parte delle persone, ma chiunque utilizzi il R.swiftpod si imbatterà nello stesso errore che ho avuto perché R.swiftè una directory
Dan F

156

modificare

A partire da Swift 4.2, il supporto a livello di lingua è disponibile sia per avvertimenti che per errori.

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

Risposta originale

Veloce, sporco e oh così elegantemente semplice allo stesso tempo.

// Description of what you need to fix

var FIX_ME__🛠🛠🛠: AnyObject

Emette un avviso che "FIX_ME__🛠🛠🛠" non è mai stato utilizzato.

Puoi aggiungere emoticon al nome della variabile se vuoi ... Uso spesso 😱 e 🛠, per qualcosa che ha davvero bisogno di essere riparato che prenderei anche in considerazione 💩. È possibile sostituire FIX_ME__con quello che vuoi: ALGORITHM_NEEDS_REVIEW, BugID_148, o JOHNNY_YOU_BROKE_THISsono alcuni esempi.

Emoticon veloci, senza impostazioni, concise ed emoticon possono persino aggiungere umorismo / personalità al tuo codice. A volte la soluzione più semplice è la soluzione migliore.


6
... Perché tutti i voti negativi? Funziona allo stesso modo di qualsiasi altro metodo qui. Se stai votando male, almeno dai un motivo, forse non sono stato abbastanza chiaro, o c'è qualcosa di sbagliato in quello che sto facendo. Mi piacerebbe sapere se c'è.
Jordan Smith,

16
Sì, non sono sicuro del perché questo non sia più votato. Tutte le altre soluzioni sono troppo complicate.
Simone Manganelli,

3
@ZaEeMZaFaR molto probabilmente il compilatore si sbarazzerebbe di esso. Inoltre, nella maggior parte dei casi questi problemi verranno risolti prima del rilascio. E - anche se per qualsiasi motivo, il compilatore non è abbastanza intelligente da sbarazzarsene (penso che sia molto improbabile) - 100 Int vars in memory è 6.4kb di memoria - praticamente nulla. Non credo che tu abbia un punto valido, scusa.
Jordan Smith,

4
Ho usato gli altri ma sono passato all'utilizzo di questo. È il più semplice e puoi anche darti un piccolo messaggio che verrà visualizzato nell'avvertimento, ovvero: let fixMeMakeMeNonOptional: Intti dà Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it nel navigatore del problema. Tutte le altre soluzioni offrono messaggi di errore molto più generici.
Nathan Perry,

1
@NathanPerry sì, d'accordo. Configurare qualcosa di complesso non è sempre un'opzione, specialmente quando lavori in gruppo o su più progetti, ecc. Inoltre, le soluzioni semplici sono sempre le migliori. Al momento ho appena inserito il messaggio accanto ad esso in un commento, ma anche quello che fai non è una cattiva idea.
Jordan Smith,

81

Aggiornamento post WWDC 2018

A partire da Xcode 10 e Swift 4.2 ora potrai #warningriutilizzare in questo modo:

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

Questo verrà visualizzato come un avviso in Xcode proprio come previsto!

Funziona anche in combinazione con i #ifcontrolli, ad esempio il seguente mostrerà un avviso solo se la tua piattaforma di destinazione è iOS:

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

C'è anche #errorse vuoi che la tua build fallisca.


Risposta pre WWDC 2018

In Swift utilizzando XCode 6 è possibile utilizzare diversi tipi di punti di riferimento per scopi diversi. Ecco cosa dice Apple al riguardo:

Xcode ora supporta // MARK :, // TODO: e // FIXME: punti di riferimento per annotare il codice ed elencarli nella barra di salto.

Quindi per impostare un avviso con una descrizione dovresti usare qualcosa del genere:

//TODO: Clean up this code after testing

Se vuoi solo impostare un segno breve (supponendo che ricorderai cosa fare), usa questo:

//FIXME

EDIT: Questi punti di riferimento tuttavia appaiono solo nella barra di salto di XCode che potrebbe non essere ciò che desideri e ciò che ti aspetteresti, specialmente dai segni // TODO: e // FIXME. Ho archiviato un radar su questo: # 17776817. Speriamo che Apple lo aggiunga nelle prossime build in XCode 6.

SOLUZIONE (EDIT 2): Se si installa lo Swift Linter via Homebrew (eseguito brew install swiftlintdopo una brew update) e aggiungere lo script di build suggerito al progetto, poi si vedrà tutti i tuoi TODOe FIXMEpunti di riferimento appaiono come avvisi all'interno di Xcode. SwiftLint aggiungerà anche alcuni altri avvisi / errori che è possibile configurare per soddisfare le proprie esigenze: posso solo consigliare di utilizzare SwiftLint e risolve questo problema in modo eccezionale!


7
Purtroppo questi non vengono visualizzati nel pannello degli avvisi quando compili la tua app. Sto ancora aspettando uno che sporge come un pollice dolorante, quindi non è probabile che te ne dimentichi. Questi appaiono solo nella barra di scorrimento e dovresti ricordare di cercare "// TODO" nel tuo progetto per trovarlo. O se qualcuno sa come vederli per l'intero progetto, fammelo sapere. - tempo per un altro radar :)
SomeGuy

1
Sì, hai ragione. Pensavo che la barra di salto fosse la barra laterale a sinistra e che quei segni apparissero sul Navigatore Issue, ma non lo fanno. Ho appena presentato un radar su questo: # 17776817. :)
Jeehut,

@SomeGuy Cosa intendi con che si presentano nella barra di scorrimento? Da quello che posso vedere non sono dove sulla barra che si trova nella parte superiore della finestra dell'editor in Xcode. L'unico modo per notarli (per me) sembra essere cercarli con Command + F. Dove sono mostrati i punti di riferimento?
almel

2
@almel La barra di scorrimento è il menu a discesa nella parte superiore di un file, fornisce un elenco di funzioni nel file corrente i.cubeupload.com/jLRwTs.png
SomeGuy

55

Non ancora aggiunto dal team Apple. Quello che ho deciso di fare è probabilmente un imbroglio, ma almeno mi mostra un messaggio FIXME. Quindi quello che faccio è dichiarare la funzione FIXME () nel file Swift:

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

e quando lo chiamo da qualsiasi altra funzione mostra un avviso, ad es

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

inserisci qui la descrizione dell'immagine

Per Swift 2 utilizzare

@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")

2
Solo per la cronaca: @availability è stato rinominato in "@available" in rapido 2.
Tobias

42

Guarda questo articolo .

Puoi scrivere il tuo script che evidenzierà tutti i tag.

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

Questo risulta a: inserisci qui la descrizione dell'immagine


Aggiungi egrep --directories='skip'per ignorare le directory con nomi come Device.swift
chunkyguy il

12

In alternativa, se desideri che venga visualizzato qualcosa nel pannello degli avvisi, puoi scrivere qualcosa del tipo:

if (false){
   var x = 2;
}

Non puoi davvero mostrare alcun testo da mostrare, ma almeno è un indicatore più visibile, specialmente se tendi a trattare (la maggior parte) degli avvisi come errori.


11
O semplicemente se falso {"il messaggio di avviso"}
Bao Lei

Questa soluzione è terribile. Ma sembra essere il migliore disponibile. Votato, grazie.
skagedal,


5

Un CocoaPod che stavo usando aveva il .swiftsuo nome, quindi è stata restituita una directory, che ha causato l'arresto anomalo dello script di Kyle. L'aggiunta -type fal findcomando risolve il problema solo osservando i file corrispondenti *.swiftanziché restituire anche le directory che corrispondono al modello.

Codice finale che ho usato:

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
C'è un modo per non lamentarsi del compilatore? Ricevo "Comando / bin / sh errori emessi ma non ho restituito un codice di uscita diverso da zero per indicare un errore"
Chris Paveglio,

In alternativa, vedi questo commento sopra
grosso

4

Se non sopporti di modificare la configurazione della build, un altro semplice rimedio domestico è quello di attaccare un segnaposto dell'editor davanti al commento:

<#todo#>// stop and fixme!

Durante la compilazione viene visualizzato l'errore "Editor segnaposto nel file di origine", ma a differenza della soluzione di Jordan, non vi sono errori attivi che ti infastidiscono durante la digitazione:

editore segnaposto


Bella idea - ma non è l'idea di lanciare un avvertimento e non un errore? Fare questo non ti permetterà di costruire fino a quando non lo rimuovi, il che, nella maggior parte dei casi (la maggior parte?), Non è sicuramente quello che desideri. I segni Todo e Fixme a volte comportano settimane di lavoro - Immagino che vorresti costruire ed eseguire il tuo progetto in questo periodo :)
Jordan Smith

Certo, questo è un buon punto. Questo approccio è utile solo per le cose da fare più urgenti che devono accadere prima di eseguire il commit o persino di eseguire l'applicazione. Il vantaggio principale è che l'evidenziazione della sintassi e altre bellezze dell'editor continuano a funzionare nonostante la presenza di questo segnaposto. Uso qui alcuni degli altri approcci, incluso il tuo, ma i segnaposto a volte sono utili durante il multitasking. Si adatta agli stessi casi d'uso degli inserti segnaposto Xcode durante il completamento automatico di una chiamata di funzione.
Minh Nguyễn,

3

Dopo molte ricerche e desideri, sono convinto che tale entità non esiste. Sono ancora fiducioso con le ultime note di rilascio di Xcode che menzionano la continua mancanza di un meccanismo di marchio #pragma, potrebbero anche venire #warning e #error.

Inoltre, consiglio vivamente di presentare un radar con Apple su bugreport.apple.com per aggiungere questa funzionalità (puoi duplicare 17702491).


1
Ho fatto la mia parte: rdar: // 19005171
David H,

1
Anche riempito un radar
HixField

2

Abbiamo scritto uno strumento configurabile che consente di inserire avvisi ed errori in Xcode Issue Navigator in base al tag di commento e alla configurazione della build: https://github.com/doubleencore/XcodeIssueGenerator

Installalo:

brew tap doubleencore/tap
brew install xcodeissuegenerator

Quindi inserire una riga in una fase di costruzione di Run Script:

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

Ecco un articolo che descrive come lo usiamo.


2

Potrei essere in ritardo alla festa con Xcode 10 che supporta errori e avvisi, ma semplicemente inserendo una stringa:

"Need to finish implementing this"

produrrà un avviso: String literal is unusedcon il completamento automatico ancora funzionante e il progetto ancora in fase di compilazione.


1

La mia risposta non è del tutto soddisfacente per la tua domanda, ma se vuoi qualcosa di facile puoi usare questo plugin di alcatraz che funziona in tutti i progetti senza ulteriori preparativi. Basta fare quanto segue:

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

Ha anche preferenze per l'aggiunta di nuovi tag

inserisci qui la descrizione dell'immagine


1

Vantaggio di questo frammento: non mostra avvisi dai pod:

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

Come installare:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.