Avant Swift, je définirais un ensemble de schémas pour les versions alpha, bêta et de distribution. Chacun de ces schémas aurait un ensemble de macros qui ont été définies pour créer certains comportements au niveau du projet. L'exemple le plus simple est la macro DEBUG = 1 définie par défaut pour tous les projets Xcode dans le schéma par défaut pour la génération Exécuter. Vous pouvez interroger #ifdef DEBUG ... et prendre des décisions dans le code en conséquence, même en compilant du code non nécessaire.
Il semble que ce type de synchronisation de configuration ne soit pas aussi facile avec Swift, car les macros ne sont pas prises en charge. Quelqu'un peut-il suggérer une approche comparable, peu importe si le code est compilé en tant que tel. Je voudrais passer les fonctionnalités basées sur le schéma de construction, cependant.
Dans Swift, vous pouvez toujours utiliser les macros du préprocesseur "# if/# else/# endif" (bien que plus contraignantes), selon Apple docs . Voici un exemple:
#if DEBUG
let a = 2
#else
let a = 3
#endif
Maintenant, vous devez définir le symbole "DEBUG" ailleurs. Définissez-le dans la section "Compilateur Swift - Indicateurs personnalisés", ligne "Autres drapeaux Swift". Vous ajoutez le symbole DEBUG avec l'entrée -D DEBUG
.
(Paramètres de construction -> Compilateur Swift - Drapeaux personnalisés)
Comme d'habitude, vous pouvez définir une valeur différente dans Debug ou dans Release.
Je l'ai testé dans du code réel; cela ne semble pas être reconnu dans un terrain de jeu.
Nous avons rencontré un problème avec le fait de ne pas vouloir définir les drapeaux du compilateur Swift parce que nous ne voulions pas les configurer ni les tenir à jour pour différentes cibles, etc. De plus, dans notre code base mixte, nous ne voulions pas nous souvenir pour définir nos drapeaux de manière appropriée tout le temps pour chaque langue.
Pour nous, nous avons déclaré un fichier dans ObjC
PreProcessorMacros.h
extern BOOL const DEBUG_BUILD;
Dans le .m
PreProcessorMacros.m
#ifdef DEBUG
BOOL const DEBUG_BUILD = YES;
#else
BOOL const DEBUG_BUILD = NO;
#endif
Ensuite, dans votre en-tête de pontage Objective-C
#import "PreProcessorMacros.h"
Maintenant, utilisez ceci dans votre base de code Swift
if DEBUG_BUILD {
println("debug")
} else {
println("release")
}
C'est certainement une solution de contournement, mais cela a résolu notre problème, je l'ai donc posté ici dans l'espoir que cela aidera. Cela ne veut pas dire que les réponses existantes sont invalides.
Solution plus rapide à la méthode Logans. Définissez -D DEBUG
dans la section Other Swift Flags
de Swift Compiler - Custom Flags
dans les paramètres de construction de votre cible.
Puis déclarez la méthode suivante dans la portée globale:
#if DEBUG
let isDebugMode = true
#else
let isDebugMode = false
#endif
Maintenant, utilisez-le comme
if isDebugMode {
// Do debug stuff
}
Je travaille dans une base de code de langage mixte où le code obj-c utilise une macro pour envoyer des messages de débogage à la console (et cette macro repose sur notre drapeau de préprocesseur de débogage). Je voulais pouvoir appeler cette même macro dans le code Swift ...
C'est légèrement ennuyeux que je ne puisse pas appeler la macro directement dans le code Swift, mais au moins maintenant je n'ai qu'un seul endroit dans le projet pour m'inquiéter d'activer/désactiver le drapeau de débogage.