821 votes

Remplacement des #ifdef dans le langage Swift

En C/C++/Objective C, vous pouvez définir une macro en utilisant les préprocesseurs du compilateur. De plus, vous pouvez inclure/exclure certaines parties du code en utilisant les préprocesseurs du compilateur.

#ifdef DEBUG
    // Debug-only code
#endif

Existe-t-il une solution similaire en Swift ?

1 votes

Comme idée, vous pourriez mettre ceci dans vos en-têtes de pontage obj-c..

60 votes

Vous devriez vraiment attribuer une réponse car vous avez le choix entre plusieurs réponses et cette question vous a valu beaucoup de votes positifs.

0 votes

@Userthatisnotauser vous avez totalement manqué le point. Vous posez une question, vous obtenez de bonnes réponses - choisissez-en une. N'ignorez pas le temps et l'effort.

28voto

Vadim Motorine Points 1421

Dans les projets Swift créés avec Xcode Version 9.4.1, Swift 4.1

#if DEBUG
#endif

fonctionne par défaut car dans les macros du préprocesseur, DEBUG=1 a déjà été défini par Xcode.

Vous pouvez donc utiliser #if DEBUG "out of box".

D'ailleurs, la façon d'utiliser les blocs de compilation de condition en général est écrite dans le livre d'Apple The Swift Programming Language 4.1 (la section Compiler Control Statements) et la façon d'écrire les drapeaux de compilation et la contrepartie des macros C en Swift est écrite dans un autre livre d'Apple Using Swift with Cocoa and Objective C (dans la section Preprocessor Directives).

J'espère qu'à l'avenir Apple écrira les contenus plus détaillés et les index de ses livres.

21voto

midhun p Points 347

XCODE 9 ET PLUS

#if DEVELOP
    //
#elseif PRODCTN
    //
#else
    //
#endif

16voto

Mojtaba Hosseini Points 2525

Il y a quelques processeurs qui prennent un argument et je les ai listés ci-dessous. Vous pouvez changer l'argument comme vous voulez :

#if os(macOS) /* Checks the target operating system */

#if canImport(UIKit) /* Check if a module presents */

#if swift(<5) /* Check the Swift version */

#if targetEnvironment(simulator) /* Check envrionments like Simulator or Catalyst */

#if compiler(<7) /* Check compiler version */

Vous pouvez également utiliser des drapeaux personnalisés comme DEBUG ou tout autre drapeau que vous avez défini

#if DEBUG
print("Debug mode")
#endif

7voto

Rivera Points 4219

Après le réglage DEBUG=1 dans votre GCC_PREPROCESSOR_DEFINITIONS Paramètres de construction Je préfère utiliser une fonction pour effectuer ces appels :

func executeInProduction(_ block: () -> Void)
{
    #if !DEBUG
        block()
    #endif
}

Et ensuite, il suffit d'inclure dans cette fonction tout bloc que je veux omettre dans les constructions Debug :

executeInProduction {
    Fabric.with([Crashlytics.self]) // Compiler checks this line even in Debug
}

L'avantage par rapport à :

#if !DEBUG
    Fabric.with([Crashlytics.self]) // This is not checked, may not compile in non-Debug builds
#endif

C'est que le compilateur vérifie la syntaxe de mon code, donc je suis sûr que sa syntaxe est correcte et qu'il construit.

4voto

sachin_kvk Points 59

[!Dans Xcode 8 et plus, allez dans les paramètres de construction -> recherchez les drapeaux personnalisés. ]](https://i.stack.imgur.com/Bbvmk.png) 1

En code

 #if Live
    print("Live")
    #else
    print("debug")
    #endif

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X