在没有预处理器macros的情况下,是否有办法在Xcode项目中的项目级别定义实际的特定于scheme的标志

在swift之前,我会定义一套alpha,beta和distribution版本的scheme。 这些scheme中的每一个都会有一组macros,这些macros被定义为在项目级别控制某些行为。 最简单的例子是DEBUG = 1macros,默认情况下默认为Run build的默认scheme中的所有Xcode项目定义。 可以查询#ifdef DEBUG …并相应地在代码中作出决定,甚至编译出非必要的代码。

看起来这种types的configuration门控并不像使用swift那样容易,因为不支持macros。 有人可以提出一个类似的方法,我不在乎代码是否编译出来,本身。 不过,我想根据构buildscheme来设置function。

在Swift中,仍然可以使用“#if /#else /#endif”预处理器macros(尽pipe受到更多限制),按照Apple文档 。 这是一个例子:

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

现在,您必须在别处设置“DEBUG”符号。 将其设置在“Swift编译器 – 自定义标志”部分的“其他Swift标志”行中。 用-D DEBUG条目添加DEBUG符号。

(生成设置 – > Swift编译器 – 自定义标志) 在这里输入图像说明

像往常一样,您可以在“debugging”或“发行版”中设置不同的值。

我用真实的代码testing了它; 它似乎不被认为在操场上。

我们遇到了一个问题,不想设置swift编译器标志,因为我们不想设置它们,并保持它们不同的目标等等。另外,在我们的混合代码库中,我们不想记住每种语言都适当地设置我们的标志。

对于我们的,我们在ObjC中声明了一个文件

PreProcessorMacros.h

 extern BOOL const DEBUG_BUILD; 

在他们中

PreProcessorMacros.m

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

然后,在您的Objective-C桥接头

 #import "PreProcessorMacros.h" 

现在,在你的Swift代码库中使用这个

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

这绝对是一个解决方法,但它解决了我们的问题,所以我把它发布在希望它会帮助。 这并不意味着build议现有的答案是无效的。

更Logans方法更快速的解决scheme。 在Swift Compiler - Custom Flags Other Swift Flags中设置-D DEBUG Swift Compiler - Custom Flags在目标的构build设置中的Swift Compiler - Custom Flags部分。

然后在全局范围内声明如下方法:

 #if DEBUG let isDebugMode = true #else let isDebugMode = false #endif 

现在使用它

 if isDebugMode { // Do debug stuff } 

我在一个混合语言代码库中工作,其中obj-c代码使用macros将debugging消息发送到控制台(并且该macros依赖于我们的debugging预处理器标志)。 我想能够在swift代码中调用相同的macros…

  1. 我在我的一个obj-c类中创build了一个类方法,它是一个包含这个macros的包装器。
  2. 我将这个obj-c头添加到我们的桥头文件中。
  3. 现在我的swift代码调用这个类方法作为obj-cmacros的“代理”。

我不能直接在macros代码中直接调用macros,但至less现在我只在项目中有一个地方担心打开/closuresdebugging标志。