#ifdef remplacement, dans le langage Swift
En C/C++/Objective-C, vous pouvez définir une macro à l'aide du compilateur préprocesseurs.
En outre, vous pouvez inclure/exclure certaines parties de code à l'aide du compilateur préprocesseurs.
#ifdef DEBUG
//Debug-only code
#endif
Est-il une solution similaire dans Swift?
- Comme une idée, vous pouvez mettre ceci dans votre obj-c combler les en-têtes..
- Vous devriez vraiment prix une réponse que vous avez à choisir entre plusieurs, et cette question a eu beaucoup de votes.
Vous devez vous connecter pour publier un commentaire.
Oui vous pouvez le faire.
Dans Swift, vous pouvez toujours utiliser le "#si/#else/#endif" macros du préprocesseur (bien que limitée), comme par Apple docs. Voici un exemple:
Maintenant, vous devez définir le "DEBUG" symbole ailleurs, même si. Mettre dans le "Swift Compilateur - Drapeaux Personnalisés," section "Autres Swift Drapeaux" de ligne. Vous ajoutez les symboles de DÉBOGAGE avec le
-D DEBUG
entrée.Comme d'habitude, vous pouvez définir une valeur différente lorsque en Debug ou Release.
Je l'ai testé en réel code et il fonctionne, il ne semble pas être reconnu dans une aire de jeux bien.
Vous pouvez lire mon post original ici.
REMARQUE IMPORTANTE:
-DDEBUG=1
ne fonctionne pas. Seulement-D DEBUG
œuvres. Semble compilateur, c'est ignorer un drapeau avec une valeur spécifique.-D DEBUG
comme indiqué ci-dessus, vous devez également définirDEBUG=1
dansApple LLVM 6.0 - Preprocessing
->Preprocessor Macros
.-DDEBUG
de cette réponse: stackoverflow.com/a/24112024/747369..xcconfig
fichiers vous pouvez configurer ces macro comme ceci:OTHER_SWIFT_FLAGS = $(inherited) "-D" "MAC_APP_STORE"
.DEBUG=1
àPreprocessor Macros
, si vous ne voulez pas l'utiliser dans le code Objective-C.Apple LLVM 6.0 - Preprocessing
->Preprocessor Macros
ainsi que "Swift Compilateur - Drapeaux Personnalisés"#ifndef DEBUG
? (si pas de débogage...)-D DEBUG
(avec l'espace) ou-DDEBUG
(pas d'espace)? si vous devez également définir DEBUG=1 comme @MattQuiros dit, ne faut-il pas la réponse à être mis à jour?DEBUG=1
dansPreprocessor Macros
? êtes-vous sûr que c'est toujours le cas?-DDEBUG
) fonctionne pour moi, mais la pièce manquante de ce truc, c'est que vous devez ajouter dans le "Swift Compilateur - Drapeaux Personnalisés" section de la Cible, pas la section de ce nom de Projet paramètres.DEBUG
était déjà inclus dans lesActive Compilation Conditions
sousSwift Compiler-Custom Flags
. Cependant, je ne suis pas sûr si c'est comme ça par défaut (lorsque vous créez un nouveau projet) ou a été placé là par CocoaPods.if _isDebugAssertConfiguration() { ... }
, celui-ci est plus semblable à Andorid deif (BuildConfig.DEBUG) { ... }
Comme indiqué dans Apple Docs
J'ai réussi à faire ce que je voulais en utilisant des Configurations de Build:
Voici comment vous vérifiez pour cible:
Testé l'utilisation de Swift 2.2
-DLOCAL
, sur mon#if LOCAl #else #endif
, il tombe dans la#else
section. J'ai dupliqué la cible d'origineAppTarget
et le renommer enAppTargetLocal
& ensemble de son indicateur personnalisé.#if LOCAL
, le résultat quand je le lance avec le simulateur et tombe dans#else
pendant le test. Je veux qu'il tombe dans#if LOCAL
ainsi au cours des essais.Active Compilation Conditions
au lieu deOther Swift Flags
. Maintenant, il y a un contrôle plus granulaire en fonction de la configurationD
si vous utilisezActive Compilation Conditions
Dans de nombreuses situations, vous n'avez pas vraiment besoin conditionnelle compilation; vous avez juste besoin conditionnelle comportement que vous pouvez allumer et éteindre. Pour cela, vous pouvez utiliser une variable d'environnement. Cela a l'énorme avantage que vous n'avez pas à recompiler.
Vous pouvez définir la variable d'environnement, et de facilement activer ou le désactiver, dans le système de l'éditeur:
Vous pouvez récupérer la variable d'environnement avec NSProcessInfo:
Voici un exemple réel. Mon application ne fonctionne que sur l'appareil, car il utilise la musique de la bibliothèque, qui n'existe pas sur le Simulateur. Comment, alors, à prendre des captures d'écran sur le Simulateur pour les périphériques je n'ai pas? Sans ces captures d'écran, je ne peux pas soumettre à l'AppStore.
J'ai besoin de des données fausses et un différentes façon de la traiter. J'ai deux variables d'environnement: l'un qui, lorsqu'il est sous tension, raconte l'application pour générer les fausses données à partir de données réelles lors de l'exécution de mon appareil; l'autre, qui, lorsqu'il est sous tension, utilise les données fausses (pas le manque de bibliothèque de musique) lors de l'exécution sur le Simulateur. La commutation de chacun de ces modes on /off est facile grâce à la variable d'environnement cases à cocher dans le Schéma de l'éditeur. Et le bonus, c'est que je ne peux pas utiliser accidentellement dans mon App Store construire, parce que l'archivage n'a pas de variables d'environnement.
nil
pour leString?
. Donc, si vous traiter correctement avec le résultat en option il l'habitude de planter votre application. Voici la Xcode9 extrait de:let myCustomVar = ProcessInfo.processInfo.environment["MY_CUSTOM_VAR"]
.myCustomVar
.if dic["TRIPLE"] != nil
) mais merci pour souligner le point.Un changement majeur de
ifdef
de remplacement est venu avec Xcode 8. j'.e à utiliser de Active Compilation Conditions.Reportez-vous à des capacités et de Liaison dans Xcode 8 Release note.
De nouveaux paramètres de construction de la
Nouveau paramètre:
SWIFT_ACTIVE_COMPILATION_CONDITIONS
Précédemment, nous avons dû déclarer vos drapeaux de compilation conditionnelle en vertu de OTHER_SWIFT_FLAGS, se souvenant d'ajouter le préfixe “-D” pour le réglage. Par exemple, pour conditionnellement compiler avec une MYFLAG valeur:
La valeur à ajouter à la mise en
-DMYFLAG
Maintenant nous avons seulement besoin de passer la valeur MYFLAG à la nouvelle configuration. Le temps de déplacer tous ces compilation conditionnelle valeurs!
Veuillez consulter le lien ci-dessous pour plus d'Swift Paramètres de construction de la fonctionnalité dans Xcode 8:
http://www.miqu.me/blog/2016/07/31/xcode-8-new-build-settings-and-analyzer-improvements/
De Swift 4.1, si vous avez besoin simplement de vérifier si le code est construit avec debug ou release de configuration, vous pouvez utiliser les fonctions intégrées:
_isDebugAssertConfiguration()
(true lorsque l'optimisation est défini à-Onone
)(non disponible sur Swift 3+)_isReleaseAssertConfiguration()
(true lorsque l'optimisation est défini à-O
)_isFastAssertConfiguration()
(true lorsque l'optimisation est défini à-Ounchecked
)par exemple
En comparaison avec les macros du préprocesseur,
-D DEBUG
drapeau de l'utiliser✗ Sans-papiers, ce qui signifie que la fonction peut être retiré en toute mise à jour (mais il devrait être AppStore-coffre depuis l'optimiseur de les transformer en des constantes)
@testable
l'attribut, sort incertain sur l'avenir de la Swift.✗ L'aide de if/else sera toujours générer un "ne Sera jamais exécutée" alerte.
if _isDebugAssertConfiguration()
seront évalués àif false
en mode release etif true
est le mode de débogage.#if config(debug)
._isReleaseAssertConfiguration()
est pas valide, les deux autres devient public nouveau en raison d'un bogue.Xcode 8 et au-dessus de
Utilisation Active Compilation Conditions paramètre dans paramètres de construction /Swift compilateur - drapeaux Personnalisés.
ALPHA
,BETA
etc.Puis vérifier avec compilation conditions comme ceci:
Il n'y a pas de Swift préprocesseur. (Pour une chose, un code arbitraire de substitution des pauses type et de la mémoire de la sécurité.)
Swift ne comprennent moment de la construction, des options de configuration, cependant, de sorte que vous pouvez conditionnellement inclure du code pour certaines plates-formes ou de construire des styles ou en réponse à des indicateurs de définir avec
-D
compilateur args. Contrairement à C, cependant, une condition compilé section de votre code doit être syntaxiquement complète. Il y a un article à ce sujet dans L'utilisation de Swift Avec Cocoa et Objective-C.Par exemple:
INT_CONST
n'importe où unfloat
serait acceptée. Swift ne serait pas permettre cela. Aussi, si vous pouviez fairevar floatVal = INT_CONST
inévitablement, il serait en rupture plus tard, lorsque le compilateur s'attend à uneInt
mais vous l'utilisez comme unFloat
(type defloatVal
serait déduit queInt
). 10 moulages plus tard, et son juste cleaner pour supprimer les macros...Mes deux cents pour Xcode 8:
a) Un indicateur personnalisé à l'aide de la
-D
préfixe fonctionne très bien, mais...b) plus Simple d'utilisation:
Dans Xcode 8 il y a une nouvelle section: "Active Compilation Conditions",
déjà avec deux lignes, pour le debug et release.
Il suffit d'ajouter vos définir SANS
-D
.-D
.isDebug Constante Basée sur Active Compilation Conditions
Un autre, peut-être plus simple solution qui résulte en une valeur booléenne que vous pouvez passer en fonctions sans émaillant
#if
conditions tout au long de votre base de code est de définirDEBUG
comme l'un de votre projet de construction de la cibleActive Compilation Conditions
et inclure les éléments suivants (je le définir comme une constante globale):isDebug Constante Basée sur les Paramètres d'Optimisation du Compilateur
Ce concept s'appuie sur kennytm réponse
Le principal avantage lorsque l'on compare les contre kennytm, est que cela ne dépend pas de privé ou de sans-papiers méthodes.
Dans Swift 4:
En comparaison avec les macros du préprocesseur et kennytm la réponse de,
-D DEBUG
drapeau de l'utiliser✓ Documenté, ce qui signifie que la fonction de suivi normal de l'API de presse/dépréciation des modèles.
✓ Aide si/d'autre ne pas générer un "ne Sera jamais exécutée" alerte.
Rapide des projets créés avec Xcode Version 9.4.1, Swift 4.1
fonctionne par défaut parce que, dans les Macros du Préprocesseur DEBUG=1 a déjà été établi par Xcode.
De sorte que vous pouvez utiliser #if DEBUG "hors de la boîte".
Par la manière, la façon d'utiliser la condition de la compilation des blocs en général est écrit dans Apple livre La Swift Langage de Programmation 4.1 (la section Compilateur de Contrôle des Déclarations) et la façon d'écrire le compiler et de drapeaux, ce qui est l'homologue du C macros dans Swift est écrit dans une autre Pomme de réserver à l'Aide de Swift avec Cocoa et Objective-C (dans la section Directives de Préprocesseur)
Espère à l'avenir d'Apple va écrire le plus détaillé des matières et de l'index pour des leurs livres.
Moignans réponse ici fonctionne très bien. Voici un autre de la paix de l'info, au cas où il permet,
Vous pouvez annuler les macros comme ci-dessous,
XCODE 9 ET AU-DESSUS DE
Après la mise
DEBUG=1
dans votreGCC_PREPROCESSOR_DEFINITIONS
Paramètres de génération, je préfère utiliser une fonction pour faire cela s'appelle:Et puis il suffit de les placer dans cette fonction un bloc que je veux omis dans les versions Debug:
L'avantage par rapport à:
Est que le compilateur vérifie la syntaxe de mon code, donc je suis sûr que sa syntaxe est correcte et construit.
![Dans Xcode 8 & au-dessus de aller de bâtir configuration -> recherche de drapeaux personnalisés
]Un
Dans le code
Cela s'appuie sur Jon Willis est réponse qui s'appuie sur des assertions, qui sera exécuté dans le Debug compilations:
Mon cas d'utilisation pour l'enregistrement des instructions d'impression. Voici un test pour la version sur iPhone X:
imprime:
Ressemble Swift 4 élimine complètement l'appel de la fonction.
Source
@inlinable
en face defunc
et ce serait la plus élégante et la plus idiomatique à la façon de Swift. Dans la version de la génération de votrecode()
bloc sera optimisé et complètement éliminé. Une fonction similaire est utilisé dans Apple NIO cadre.