Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In absence of preprocessor macros, is there a way to define practical scheme specific flags at project level in Xcode project

Tags:

ios

swift

Before swift I would define a set of schemes for alpha, beta, and distribution builds. Each of these schemes would have a set of macros that were defined to gate certain behaviors at the project level. The simplest example is the DEBUG=1 macro that is defined by default for all Xcode projects in the default scheme for the Run build. One could query #ifdef DEBUG ... and make decisions in the code accordingly, even compiling out non-necessary code.

It seems that this type of configurational gating is not as easy using swift, as macros are not supported. Can someone suggest a comparable approach, I don't care if the code is compiled out, per se. I would like to gate features based on build scheme, though.

like image 279
phoganuci Avatar asked Jun 08 '14 23:06

phoganuci


2 Answers

In Swift you can still use the "#if/#else/#endif" preprocessor macros (although more constrained), as per Apple docs. Here's an example:

#if DEBUG     let a = 2 #else     let a = 3 #endif 

Now, you must set the "DEBUG" symbol elsewhere, though. Set it in the "Swift Compiler - Custom Flags" section, "Other Swift Flags" line. You add the DEBUG symbol with the -D DEBUG entry.

(Build Settings -> Swift Compiler - Custom Flags) enter image description here

As usual, you can set a different value when in Debug or when in Release.

I tested it in real code; it doesn't seem to be recognized in a playground.

like image 54
Jean Le Moignan Avatar answered Sep 17 '22 18:09

Jean Le Moignan


We ran into an issue with not wanting to set swift compiler flags because we didn't want to have to set them and keep them up to date for different targets etc. Also, in our mixed codebase, we didn't want to make remember to set our flags appropriately all the time for each language.

For ours, we declared a file in ObjC

PreProcessorMacros.h

extern BOOL const DEBUG_BUILD; 

In the .m

PreProcessorMacros.m

#ifdef DEBUG     BOOL const DEBUG_BUILD = YES; #else     BOOL const DEBUG_BUILD = NO; #endif 

Then, in your Objective-C Bridging Header

#import "PreProcessorMacros.h" 

Now, use this in your Swift codebase

if DEBUG_BUILD {     println("debug") } else {     println("release") } 

This is definitely a workaround, but it solved our problem so I posted it here in the hopes that it will help. It is not meant to suggest that the existing answers are invalid.

like image 41
Logan Avatar answered Sep 19 '22 18:09

Logan