在没有预处理器宏的情况下,有没有一种方法可以在 Xcode 项目的项目级别定义实际的方案特定标志

在 Swift 之前,我将为 alpha、 beta 和发行版本定义一组方案。这些方案中的每一个都有一组宏,它们被定义为在项目级别上关闭某些行为。最简单的示例是 DEBUG = 1宏,该宏默认为 Run 构建的默认方案中的所有 Xcode 项目定义。可以查询 # ifdef DEBUG... 并相应地在代码中做出决策,甚至编译出不必要的代码。

由于不支持宏,这种类型的组态闸门似乎不容易快速使用。有人能提出一个类似的方法吗? 我不在乎代码本身是否被编译出来。但是,我希望基于构建方案来关闭特性。

64622 次浏览

在 Swift 中,你仍然可以按照 苹果文档使用“ # if/# else/# endf”预处理器宏(尽管受到更多限制):

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

现在,您必须在其他地方设置“ DEBUG”符号。设置它在“快速编译器-自定义标志”部分,“其他快速标志”行。使用 -D DEBUG条目添加 DEBUG 符号。

(构建设置-> 快速编译器-自定义标志) enter image description here

通常,您可以在调试或发布时设置不同的值。

我在实际代码中测试了它; 它似乎在操场上无法识别。

我们遇到了一个问题,不想设置快速编译器标志,因为我们不想设置它们,并保持它们的最新不同的目标等。此外,在我们的混合代码库中,我们不希望记住为每种语言始终适当地设置标志。

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

PreProcessorMacros.h

extern BOOL const DEBUG_BUILD;

在。 m

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")
}

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

更快捷的解决方案,罗根方法。设置 Other Swift FlagsSwift Compiler - Custom Flags节中的 -D DEBUG在建设设置你的目标。

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

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

现在把它当做

if isDebugMode {
// Do debug stuff
}

我使用的是混合语言代码库,obj-c 代码使用一个宏将调试消息发送到控制台(该宏依赖于我们的调试预处理器标志)。我希望能够调用相同的宏在迅速代码..。

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

有点烦人的是,我不能直接在快捷代码中调用宏,但至少现在我在项目中只有一个地方需要担心调试标志的打开/关闭。

对于我来说,将“ 主动编译条件”的调试项设置为“ DEBUG”工作。

然后在 # IF DEBUG 中使用 DEBGU 键工作,在调试模式下工作,在发布模式下使用 # ELSE:

  1. 选择目标,
  2. 在“生成设置”选项卡中搜索“活动编译条件”,
  3. 将其“ Debug”项的值设置为“ YourKeyWord”,
  4. 简单使用如下:

    #if DEBUG
    print("You'r running in DEBUG mode!")
    #else
    print("You'r running in RELEASE mode!")
    #endif