在C/C++/Objective C中,可以使用编译器预处理器定义宏。此外,您可以使用编译器预处理器包含/排除代码的某些部分。
#ifdef DEBUG
// Debug-only code
#endif
Swift中有类似的解决方案吗?
在C/C++/Objective C中,可以使用编译器预处理器定义宏。此外,您可以使用编译器预处理器包含/排除代码的某些部分。
#ifdef DEBUG
// Debug-only code
#endif
Swift中有类似的解决方案吗?
当前回答
我的两分钱用于Xcode 8:
a) 使用-D前缀的自定义标志工作正常,但。。。
b) 更简单的使用:
在Xcode 8中有一个新的部分:“活动编译条件”,已经有两行,用于调试和发布。
只需添加无D的定义。
其他回答
从Swift 4.1开始,如果你只需要检查代码是用调试还是发布配置构建的,你可以使用内置函数:
_isDebugAssertConfiguration()(当优化设置为-Onone时为true)_isReleaseAssertConfiguration()(当优化设置为-O时为true)(在Swift 3+上不可用)_isFastAssertConfiguration()(当优化设置为-Ounchecked时为true)
e.g.
func obtain() -> AbstractThing {
if _isDebugAssertConfiguration() {
return DecoratedThingWithDebugInformation(Thing())
} else {
return Thing()
}
}
与预处理器宏相比,
✓ 您不需要定义自定义的-D DEBUG标志来使用它~它实际上是根据优化设置定义的,而不是Xcode构建配置✗ 未记录,这意味着该函数可以在任何更新中删除(但它应该是AppStore安全的,因为优化器会将这些转换为常量)这些内容一度被删除,但由于缺少@testable属性而重新公开,未来的Swift命运未卜。✗ 在if/else中使用将始终生成“将永远不会执行”警告。
在GCC_PREPROCESSOR_DEFINITIONS构建设置中设置DEBUG=1后,我更喜欢使用函数进行以下调用:
func executeInProduction(_ block: () -> Void)
{
#if !DEBUG
block()
#endif
}
然后,只需在此函数中包含我希望在调试构建中省略的任何块:
executeInProduction {
Fabric.with([Crashlytics.self]) // Compiler checks this line even in Debug
}
与以下各项相比的优势:
#if !DEBUG
Fabric.with([Crashlytics.self]) // This is not checked, may not compile in non-Debug builds
#endif
是编译器检查我的代码的语法,所以我确信它的语法是正确的,并进行编译。
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/
有一些处理器接受一个参数,我在下面列出了它们。您可以随意更改参数:
#if os(macOS) /* Checks the target operating system */
#if canImport(UIKit) /* Check if a module presents */
#if swift(<5) /* Check the Swift version */
#if targetEnvironment(simulator) /* Check envrionments like Simulator or Catalyst */
#if compiler(<7) /* Check compiler version */
此外,您可以使用任何自定义标志,如DEBUG或您定义的任何其他标志
#if DEBUG
print("Debug mode")
#endif
Xcode 8及以上
使用Build设置/Swift编译器-自定义标志中的Active Compilation Conditions设置。
这是将条件编译标志传递给Swift编译器的新构建设置。简单地添加如下标志:ALPHA、BETA等。
然后使用如下编译条件进行检查:
#if ALPHA
//
#elseif BETA
//
#else
//
#endif
提示:您也可以使用#if!ALPHA等。