在没有预处理器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…
- 我在我的一个obj-c类中创build了一个类方法,它是一个包含这个macros的包装器。
- 我将这个obj-c头添加到我们的桥头文件中。
- 现在我的swift代码调用这个类方法作为obj-cmacros的“代理”。
我不能直接在macros代码中直接调用macros,但至less现在我只在项目中有一个地方担心打开/closuresdebugging标志。