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.

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.

Risposte:
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.
-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
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.
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.
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.
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!
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
}

Per Swift 2 utilizzare
@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
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/"
egrep --directories='skip'per ignorare le directory con nomi come Device.swift
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.
Ho proposto e implementato questa funzione e verrà fornita con Swift 4.2. Puoi usarlo ora scaricando la mastertoolchain su swift.org .
#if os(macOS)
#error("macOS is not supported")
#endif
#warning("finish this")
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/"
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:
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).
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.
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.
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
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:
//WARNINGproprio come lo sarà #pragma//MARKma attualmente nessuno dei due viene aggiunto a XCode beta.