web-dev-qa-db-fra.com

En l'absence de macros de préprocesseur, existe-t-il un moyen de définir des indicateurs pratiques spécifiques au schéma au niveau du projet dans le projet Xcode?

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.

169
banDedo

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) enter image description here

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. 

450
Jean Le Moignan

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.

30
Logan

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
}
6
Sahil Kapoor

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 ...

  1. J'ai créé une méthode de classe sur l'une de mes classes obj-c qui enveloppe la macro.
  2. J'ai ajouté cet en-tête obj-c à notre fichier d'en-tête de pont.
  3. Maintenant, mon code Swift appelle cette méthode de classe en tant que "proxy" de la macro obj-c.

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.

0
ghostatron