Swift: équivalent #warning

192

Swift a-t-il un équivalent #warning? Il est simplement utilisé pour afficher un avertissement dans la propre interface graphique de Xcode

Je voudrais également savoir s'il existe un équivalent #error.

Apple a déclaré que la marque #pragma allait bientôt arriver, il pourrait en être de même avec cela.

entrez la description de l'image ici

Un gars
la source
7
Je suppose que ce sera //WARNINGexactement comme #pragma, //MARKmais actuellement aucun d'eux n'est ajouté à la version bêta de XCode.
Lord Zsolt
1
Je suggère fortement de déposer un radar pour demander // AVERTISSEMENT
pixel
@pixel Je viens de déposer un radar
SomeGuy
Pouvez-vous accepter la réponse de Jordan Smith? Ceci est maintenant intégré à Swift en tant que #warning
Bill

Réponses:

157

À l'avenir, les développeurs Apple pourraient très bien publier un //WARNING:point de repère ou fournir la fonctionnalité d'un autre point de repère nommé.

Cependant, pour invoquer cette fonctionnalité avec Swift dans Xcode aujourd'hui, vous pouvez procéder comme indiqué par Ben Dodson & Jeffrey Sambells:

Ajoutez un nouveau script d'exécution à l'onglet des phases de génération de votre cible (paramètres du projet> phases de génération> '+'> nouvelle phase de script d'exécution) et collez le code suivant dans la zone vide:

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

Cela forcera Xcode à signaler un avertissement au moment de la compilation pour tout // TODO:ou des // FIXME:commentaires que vous annotez.

Alternativement, vous pouvez modifier TAGS avec une balise personnalisée: TAGS="WARNING:"dans le code ci-dessus qui conserverait le comportement par défaut pour TODO & FIXME et déclencherait un avertissement de temps de compilation sur tous les commentaires balisés comme // WARNING:.

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

EDIT: 18/11/14

@ david-h a soulevé un bon point dans son commentaire. Si vous vouliez uniquement déclencher ces avertissements dans une configuration de build spécifique, vous pouvez effectuer les opérations suivantes:

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

Alternativement, vous pouvez utiliser "Release" plutôt que "Debug" pour cibler uniquement les builds de production.

Kyle G
la source
Ceci est une très bonne solution temporaire jusqu'à ce qu'Apple la corrige :)
SomeGuy
Le problème avec cela est que mon application a deux modes - développement et production. Je veux savoir qu'il est propre en production, mais je reçois un avertissement en cours de développement qui me rappelle essentiellement que je suis en mode développeur - en utilisant différentes URL, délais d'attente, autres paramètres, etc. La suggestion d'Arie ci-dessus me permet de le faire, votre technique juste signale tout. Cela dit, cette technique a son utilité, donc j'ai voté pour elle aussi!
David H
Quelle idée utile! Merci de partager cette information utile.
Tommy
@kyle Pourriez-vous s'il vous plaît laissez-moi savoir la signification de perl -p -e "s / ($ TAGS) / warning: \ $ 1 /" cette ligne
Rocker
3
Fonctionne très bien, mais j'ai dû ajouter l' -type foption à la findcommande pour exclure les répertoires des résultats de la recherche. Cela ne devrait pas être un problème pour la plupart des gens, mais quiconque utilise le R.swiftpod rencontrera la même erreur que moi car il R.swifts'agit d'un répertoire
Dan F
156

Éditer

Depuis Swift 4.2, la prise en charge au niveau de la langue est disponible pour les avertissements et les erreurs de génération.

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

Réponse originale

Rapide, sale et oh si élégamment simple tout en même temps.

// Description of what you need to fix

var FIX_ME__🛠🛠🛠: AnyObject

Lance un avertissement indiquant que «FIX_ME__🛠🛠🛠» n'a jamais été utilisé.

Vous pouvez ajouter des émoticônes au nom de la variable si vous le souhaitez ... J'utilise souvent 😱 et 🛠, pour quelque chose qui a vraiment besoin d'être réparé, je considérerais même even. Vous pouvez remplacer FIX_ME__avec tout ce que vous voulez: ALGORITHM_NEEDS_REVIEW, BugID_148ou JOHNNY_YOU_BROKE_THISquelques exemples.

Rapide, sans configuration, concis et les émoticônes peuvent même ajouter de l'humour / de la personnalité à votre code. Parfois, la solution la plus simple est la meilleure.

Jordan Smith
la source
6
... Pourquoi tous les votes négatifs? Cela fonctionne aussi bien que toute autre méthode ici. Si vous votez contre, donnez au moins une raison, peut-être que je n'étais pas assez clair, ou qu'il y a quelque chose qui ne va pas dans ce que je fais. J'aimerais savoir s'il y en a.
Jordan Smith
16
Ouais, je ne sais pas pourquoi ce n'est pas plus voté. Toutes les autres solutions sont beaucoup trop compliquées.
Simone Manganelli
3
@ZaEeMZaFaR le compilateur s'en débarrasserait très probablement. De plus, dans la plupart des cas, ces problèmes seront résolus avant la sortie. Et - même si pour une raison quelconque, le compilateur n'est pas assez intelligent pour s'en débarrasser (je pense que c'est très peu probable) - 100 vars Int en mémoire représentent 6,4 ko de mémoire - essentiellement rien. Je ne pense pas que vous ayez un argument valable, désolé.
Jordan Smith
4
J'ai utilisé les autres, mais je suis passé à celui-ci. C'est le plus simple et vous pouvez même vous donner un petit message qui apparaîtra dans l'avertissement, c'est-à-dire: let fixMeMakeMeNonOptional: Intvous donne Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it dans le navigateur de problème. Toutes les autres solutions vous donnent des messages d'erreur beaucoup plus génériques.
Nathan Perry
1
@NathanPerry oui, d'accord. La mise en place de quelque chose de complexe n'est pas toujours une option, en particulier lorsque vous travaillez en équipe ou sur plusieurs projets, etc. De plus, des solutions simples sont toujours les meilleures. Je viens de mettre le message à côté dans un commentaire, mais ce que vous faites n'est pas une mauvaise idée non plus.
Jordan Smith
81

Mise à jour post WWDC 2018

À partir de Xcode 10 et Swift 4.2, vous pourrez maintenant #warningréutiliser comme ceci:

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

Cela apparaîtra comme un avertissement dans Xcode comme prévu!

Cela fonctionne même en combinaison avec des #ifvérifications, par exemple, ce qui suit n'affichera un avertissement que si votre plate-forme cible est iOS:

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

Il y a aussi #errorsi vous voulez que votre build échoue.


Réponse avant la WWDC 2018

Dans Swift utilisant XCode 6, vous pouvez utiliser différents types de points de repère à différentes fins. Voici ce qu'Apple en dit:

Xcode prend désormais en charge // MARK :, // TODO: et // FIXME: repères pour annoter votre code et les répertorie dans la barre de saut.

Donc, pour définir un avertissement avec une description, vous utiliseriez quelque chose comme ceci:

//TODO: Clean up this code after testing

Si vous voulez simplement définir une marque courte (en supposant que vous vous souviendrez quoi faire), utilisez ceci:

//FIXME

ÉDITER: Ces points de repère n'apparaissent cependant que dans la barre de saut de XCode, ce qui pourrait ne pas être ce que vous souhaitez et ce à quoi vous vous attendez - en particulier des marques // TODO: et // FIXME. J'ai déposé un radar à ce sujet: # 17776817. Espérons qu'Apple l'ajoutera dans les versions à venir de XCode 6.

SOLUTION (EDIT 2): Si vous installez le Swift Linter via Homebrew (exécuté brew install swiftlintaprès a brew update) et ajoutez le script de construction suggéré à votre projet, alors vous verrez tous vos points de repère TODOet FIXMEapparaître comme des avertissements dans Xcode. SwiftLint ajoutera même quelques avertissements / erreurs supplémentaires que vous pouvez configurer pour répondre à vos besoins - je ne peux que recommander l'utilisation de SwiftLint et cela résout ce problème de manière formidable!

Jeehut
la source
7
Malheureusement, ceux-ci n'apparaissent pas dans le panneau d'avertissements lorsque vous compilez votre application. J'attends toujours celui qui dépasse comme un pouce endolori donc vous ne risquez pas de les oublier. Ceux-ci apparaissent simplement dans la barre de saut et vous devez vous rappeler de rechercher dans votre projet "// TODO" pour le trouver. Ou si quelqu'un sait comment les voir pour l'ensemble du projet, faites le moi savoir. - il est temps pour un autre radar :)
SomeGuy
1
Euh ouais, tu as raison. Je pensais que la barre de saut était la barre latérale à gauche et que ces marques apparaissaient sur le navigateur de problèmes, mais ce n'est pas le cas. Je viens de déposer un radar à ce sujet: # 17776817. :)
Jeehut
@SomeGuy Que voulez-vous dire par qu'ils apparaissent dans la barre de saut? D'après ce que je peux voir, ils ne sont nulle part sur la barre située en haut de la fenêtre de l'éditeur dans Xcode. La seule façon de les remarquer (pour moi) semble être de les rechercher avec Command + F. Où les repères sont-ils affichés?
almel
2
@almel La barre de saut est la liste déroulante en haut d'un fichier, elle donne une liste des fonctions dans le fichier actuel i.cubeupload.com/jLRwTs.png
SomeGuy
55

Pas encore ajouté par l'équipe Apple. Ce que j'ai décidé de faire est probablement une tricherie, mais au moins cela me montre un message FIXME. Donc, ce que je fais, c'est déclarer la fonction FIXME () dans le fichier Swift:

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

et quand je l'appelle à partir d'une autre fonction, il affiche un avertissement, par exemple

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

entrez la description de l'image ici

Pour Swift 2

@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
interrompre
la source
2
Juste pour mémoire: @available a été renommé "@available" dans le swift 2.
Tobias
42

Regardez cet article .

Vous pouvez écrire votre propre script qui mettra en évidence toutes les balises.

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

Cela se traduit par: entrez la description de l'image ici

kelin
la source
Ajouter egrep --directories='skip'pour ignorer les répertoires avec des noms comme Device.swift
chunkyguy
12

Comme alternative, si vous voulez que quelque chose apparaisse dans le panneau des avertissements, vous pouvez écrire quelque chose comme:

if (false){
   var x = 2;
}

Vous ne pouvez pas vraiment faire apparaître de texte, mais au moins c'est un marqueur plus visible, surtout si vous avez tendance à traiter (la plupart) des avertissements comme des erreurs.

Arie Litovsky
la source
11
Ou tout simplement faire si faux {"le message d'avertissement"}
Bao Lei
Cette solution est terrible. Mais semble être le meilleur disponible. A voté, merci.
skagedal
6

J'ai proposé et implémenté cette fonctionnalité, et elle sera livrée avec Swift 4.2. Vous pouvez l'utiliser maintenant en téléchargeant la masterchaîne d'outils sur swift.org .

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

Un CocoaPod que j'utilisais avait .swiftdans son nom, donc un répertoire a été retourné, ce qui a provoqué le crash du script par Kyle. L'ajout -type fà la findcommande résout ce problème en ne regardant que les fichiers qui correspondent*.swift au lieu de renvoyer également les répertoires qui correspondent au modèle.

Code final que j'ai utilisé:

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
la source
1
Existe-t-il un moyen de ne pas se plaindre du compilateur?
J'obtiens
Comme alternative, voir ce commentaire ci
chunkyguy
4

Si vous ne souhaitez pas ajuster la configuration de votre build, un autre remède maison simple consiste à coller un espace réservé pour l'éditeur devant le commentaire:

<#todo#>// stop and fixme!

Vous obtenez une erreur «Espace réservé de l'éditeur dans le fichier source» lorsque vous créez, mais contrairement à la solution de Jordan, il n'y a pas d'erreur en direct pour vous ennuyer lors de la frappe:

espace réservé de l'éditeur

Minh Nguyễn
la source
Bonne idée - mais n'est-ce pas l'idée de lancer un avertissement et non une erreur? Faire cela ne vous permettra pas de construire jusqu'à ce que vous le supprimiez, ce qui, dans de nombreux cas (la plupart?) N'est certainement pas ce que vous voulez. Les marques Todo et Fixme impliquent parfois des semaines de travail - j'imagine que vous voudriez construire et exécuter votre projet pendant cette période :)
Jordan Smith
Bien sûr, c'est un bon point. Cette approche n'est utile que pour les tâches plus urgentes à effectuer avant de valider ou même d'exécuter l'application. Le principal avantage est que la mise en évidence de la syntaxe et d'autres subtilités de l'éditeur continuent de fonctionner malgré la présence de cet espace réservé. J'utilise moi-même certaines des autres approches, y compris la vôtre, mais les espaces réservés sont parfois utiles lors du multitâche. Il s'adapte aux mêmes cas d'utilisation que les espaces réservés insérés par Xcode lors de la saisie automatique d'un appel de fonction.
Minh Nguyễn
3

Après beaucoup de recherches et de nostalgie, je suis convaincu qu'aucune telle entité n'existe. J'espère toujours avec les dernières notes de version de Xcode mentionnant l'absence continue d'un mécanisme de marque #pragma, #warning et #error peuvent également arriver.

En passant, je recommande fortement de déposer un radar auprès d'Apple sur bugreport.apple.com pour ajouter cette fonctionnalité (vous pouvez duper 17702491).

rcw3
la source
1
J'ai fait ma part: rdar: // 19005171
David H
1
Également rempli dans un radar
HixField
2

Nous avons écrit un outil configurable qui vous permet de mettre des avertissements et des erreurs dans Xcode Issue Navigator en fonction de la balise de commentaire et de la configuration de la construction: https://github.com/doubleencore/XcodeIssueGenerator

Installez-le:

brew tap doubleencore/tap
brew install xcodeissuegenerator

Mettez ensuite une ligne dans une phase d'exécution du 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/"

Voici un article décrivant comment nous l'utilisons.

soolwan
la source
2

Je peux être en retard à la fête avec Xcode 10 prenant en charge les erreurs et les avertissements, mais en mettant simplement une chaîne:

"Need to finish implementing this"

produira un avertissement: l' String literal is unusedauto-complétion fonctionne toujours et le projet est toujours en cours de compilation.

Przemysław Wrzesiński
la source
1

Ma réponse ne répond pas tout à fait à votre question, mais si vous voulez quelque chose de simple, vous pouvez utiliser ce plugin d' alcatraz qui fonctionne dans tous les projets sans aucune préparation supplémentaire. Procédez simplement comme suit:

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

Il a également des préférences pour ajouter de nouvelles balises

entrez la description de l'image ici

Nikolay Shubenkov
la source
1

Avantage de cet extrait - il n'affiche pas les avertissements des 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

Comment installer:

entrez la description de l'image ici

Igor
la source