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

#ifdef DEBUG
    // Debug-only code
#endif

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


当前回答

![在Xcode 8及以上版本中,转到构建设置->搜索自定义标志]1

在代码中

 #if Live
    print("Live")
    #else
    print("debug")
    #endif

其他回答

isDebug常量基于活动编译条件

另一个可能更简单的解决方案是,将DEBUG定义为项目构建目标的Active Compilation Conditions之一,并包含以下内容(我将其定义为全局常量):

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

isDebug常量基于编译器优化设置

这个概念建立在kennytm的答案之上

与kennytm相比,其主要优势在于它不依赖于私有或未记录的方法。

在Swift 4中:

let isDebug: Bool = {
    var isDebug = false
    // function with a side effect and Bool return value that we can pass into assert()
    func set(debug: Bool) -> Bool {
        isDebug = debug
        return isDebug
    }
    // assert:
    // "Condition is only evaluated in playgrounds and -Onone builds."
    // so isDebug is never changed to true in Release builds
    assert(set(debug: true))
    return isDebug
}()

与预处理器宏和kennytm的答案相比,

✓ 您不需要定义自定义的-D DEBUG标志来使用它~它实际上是根据优化设置定义的,而不是Xcode构建配置✓ 已记录,这意味着该函数将遵循正常的API发布/弃用模式。✓ 在if/else中使用不会生成“将永远不会执行”警告。

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

来源

![在Xcode 8及以上版本中,转到构建设置->搜索自定义标志]1

在代码中

 #if Live
    print("Live")
    #else
    print("debug")
    #endif

没有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等。