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

#ifdef DEBUG
    // Debug-only code
#endif

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


当前回答

在使用Xcode版本9.4.1创建的Swift项目中,Swift 4.1

#if DEBUG
#endif

默认情况下工作,因为在预处理器宏中,Xcode已设置DEBUG=1。

因此,您可以使用#if DEBUG“开箱即用”。

顺便说一句,苹果的《Swift编程语言4.1》一书(编译器控制语句一节)中写了如何使用条件编译块,而如何编写编译标志以及Swift中C宏的对应内容,则在另一本苹果的《将Swift与Cocoa和Objective C结合使用》一书中(预处理器指令一节)

希望未来苹果会为他们的书写更详细的内容和索引。

其他回答

在使用Xcode版本9.4.1创建的Swift项目中,Swift 4.1

#if DEBUG
#endif

默认情况下工作,因为在预处理器宏中,Xcode已设置DEBUG=1。

因此,您可以使用#if DEBUG“开箱即用”。

顺便说一句,苹果的《Swift编程语言4.1》一书(编译器控制语句一节)中写了如何使用条件编译块,而如何编写编译标志以及Swift中C宏的对应内容,则在另一本苹果的《将Swift与Cocoa和Objective C结合使用》一书中(预处理器指令一节)

希望未来苹果会为他们的书写更详细的内容和索引。

马特回答的Swift 5更新

let dic = ProcessInfo.processInfo.environment
if dic["TRIPLE"] != nil {
// ... do your secret stuff here ...
}
func inDebugBuilds(_ code: () -> Void) {
    assert({ code(); return true }())
}

来源

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

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

例如:

#if os(iOS)
    let color = UIColor.redColor()
#else
    let color = NSColor.redColor()
#endif

Xcode 8及以上

使用Build设置/Swift编译器-自定义标志中的Active Compilation Conditions设置。

这是将条件编译标志传递给Swift编译器的新构建设置。简单地添加如下标志:ALPHA、BETA等。

然后使用如下编译条件进行检查:

#if ALPHA
    //
#elseif BETA
    //
#else
    //
#endif

提示:您也可以使用#if!ALPHA等。