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

#ifdef DEBUG
    // Debug-only code
#endif

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


当前回答

我的两分钱用于Xcode 8:

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

b) 更简单的使用:

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

只需添加无D的定义。

其他回答

Xcode 8对ifdef替换进行了重大更改。即使用主动编译条件。

请参阅Xcode 8发行说明中的构建和链接。

新建生成设置

新设置:SWIFT_ACTIVE_COMPILATION_CONDITIONS

“Active Compilation Conditions” is a new build setting for passing conditional compilation flags to the Swift compiler.

以前,我们必须在OTHER_SWIFT_flags下声明条件编译标志,记住在设置前加上“-D”。例如,要有条件地使用MYFLAG值进行编译:

#if MYFLAG1
    // stuff 1
#elseif MYFLAG2
    // stuff 2
#else
    // stuff 3
#endif

要添加到设置的值-DMYFLAG

现在我们只需要将值MYFLAG传递到新设置。是时候移动所有这些条件编译值了!

有关Xcode 8中更多Swift Build Settings功能,请参阅以下链接:http://www.miqu.me/blog/2016/07/31/xcode-8-new-build-settings-and-analyzer-improvements/

Xcode 8及以上

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

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

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

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

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

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

在代码中

 #if Live
    print("Live")
    #else
    print("debug")
    #endif
func inDebugBuilds(_ code: () -> Void) {
    assert({ code(); return true }())
}

来源

这是基于Jon Willis的答案,该答案依赖于断言,该断言仅在调试编译中执行:

func Log(_ str: String) { 
    assert(DebugLog(str)) 
}
func DebugLog(_ str: String) -> Bool { 
    print(str) 
    return true
}

我的用例是记录打印语句。以下是iPhone X上发布版本的基准:

let iterations = 100_000_000
let time1 = CFAbsoluteTimeGetCurrent()
for i in 0 ..< iterations {
    Log ("⧉ unarchiveArray:\(fileName) memoryTime:\(memoryTime) count:\(array.count)")
}
var time2 = CFAbsoluteTimeGetCurrent()
print ("Log: \(time2-time1)" )

打印:

Log: 0.0

看起来Swift 4完全消除了函数调用。