在C/C++/Objective C中,可以使用编译器预处理器定义宏。此外,您可以使用编译器预处理器包含/排除代码的某些部分。

#ifdef DEBUG
    // Debug-only code
#endif

Swift中有类似的解决方案吗?


当前回答

func inDebugBuilds(_ code: () -> Void) {
    assert({ code(); return true }())
}

来源

其他回答

在许多情况下,您实际上不需要条件编译;您只需要可以打开和关闭的条件行为。为此,您可以使用环境变量。这有一个巨大的优点,你实际上不需要重新编译。

您可以在方案编辑器中设置环境变量,并轻松地将其打开或关闭:

您可以使用NSProcessInfo检索环境变量:

    let dic = NSProcessInfo.processInfo().environment
    if dic["TRIPLE"] != nil {
        // ... do secret stuff here ...
    }

这是一个现实生活中的例子。我的应用程序只在设备上运行,因为它使用的是模拟器上不存在的音乐库。那么,如何在模拟器上拍摄我不拥有的设备的屏幕快照?没有这些屏幕截图,我无法提交到AppStore。

我需要假数据和不同的处理方式。我有两个环境变量:一个是当打开时,告诉应用程序在我的设备上运行时从真实数据生成假数据;另一个,当打开时,在模拟器上运行时使用假数据(而不是丢失的音乐库)。由于Scheme编辑器中的环境变量复选框,打开/关闭这些特殊模式很容易。另外一个好处是,我不会在我的App Store构建中意外使用它们,因为归档没有环境变量。

是的,你能做到。

根据Apple文档,在Swift中,您仍然可以使用“#if/#else/#endif”预处理器宏(尽管更受限制)。下面是一个示例:

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

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

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

我在真实代码中测试了它,它工作了;不过,在操场上似乎认不出它。

你可以在这里阅读我的原始帖子。


重要提示:-DDEBUG=1不起作用。只有-D DEBUG有效。编译器似乎忽略了具有特定值的标志。

我的两分钱用于Xcode 8:

a) 使用-D前缀的自定义标志工作正常,但。。。

b) 更简单的使用:

在Xcode 8中有一个新的部分:“活动编译条件”,已经有两行,用于调试和发布。

只需添加无D的定义。

没有Swift预处理器。(一方面,任意代码替换破坏了类型和内存安全。)

不过,Swift确实包含了构建时配置选项,因此您可以有条件地包含某些平台或构建样式的代码,或者响应您使用-D编译器参数定义的标志。但是,与C不同,代码的有条件编译部分必须在语法上完整。在将Swift与Cocoa和Objective-C结合使用中有一节介绍了这一点。

例如:

#if os(iOS)
    let color = UIColor.redColor()
#else
    let color = NSColor.redColor()
#endif
func inDebugBuilds(_ code: () -> Void) {
    assert({ code(); return true }())
}

来源