在C/C++/Objective C中,可以使用编译器预处理器定义宏。此外,您可以使用编译器预处理器包含/排除代码的某些部分。
#ifdef DEBUG
// Debug-only code
#endif
Swift中有类似的解决方案吗?
在C/C++/Objective C中,可以使用编译器预处理器定义宏。此外,您可以使用编译器预处理器包含/排除代码的某些部分。
#ifdef DEBUG
// Debug-only code
#endif
Swift中有类似的解决方案吗?
当前回答
XCODE 9及以上
#if DEVELOP
//print("Develop")
#elseif PRODUCTION
//print("Production")
#else
//
#endif
其他回答
这是基于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完全消除了函数调用。
func inDebugBuilds(_ code: () -> Void) {
assert({ code(); return true }())
}
来源
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及以上版本中,转到构建设置->搜索自定义标志]1
在代码中
#if Live
print("Live")
#else
print("debug")
#endif
XCODE 9及以上
#if DEVELOP
//print("Develop")
#elseif PRODUCTION
//print("Production")
#else
//
#endif