在C/C++/Objective C中,可以使用编译器预处理器定义宏。此外,您可以使用编译器预处理器包含/排除代码的某些部分。
#ifdef DEBUG
// Debug-only code
#endif
Swift中有类似的解决方案吗?
在C/C++/Objective C中,可以使用编译器预处理器定义宏。此外,您可以使用编译器预处理器包含/排除代码的某些部分。
#ifdef DEBUG
// Debug-only code
#endif
Swift中有类似的解决方案吗?
当前回答
从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中使用将始终生成“将永远不会执行”警告。
其他回答
没有Swift预处理器。(一方面,任意代码替换破坏了类型和内存安全。)
不过,Swift确实包含了构建时配置选项,因此您可以有条件地包含某些平台或构建样式的代码,或者响应您使用-D编译器参数定义的标志。但是,与C不同,代码的有条件编译部分必须在语法上完整。在将Swift与Cocoa和Objective-C结合使用中有一节介绍了这一点。
例如:
#if os(iOS)
let color = UIColor.redColor()
#else
let color = NSColor.redColor()
#endif
XCODE 9及以上
#if DEVELOP
//print("Develop")
#elseif PRODUCTION
//print("Production")
#else
//
#endif
莫伊尼昂的回答很好。这是另一条信息,以防有帮助,
#if DEBUG
let a = 2
#else
let a = 3
#endif
您可以像下面这样否定宏,
#if !RELEASE
let a = 2
#else
let a = 3
#endif
有一些处理器接受一个参数,我在下面列出了它们。您可以随意更改参数:
#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版本9.4.1创建的Swift项目中,Swift 4.1
#if DEBUG
#endif
默认情况下工作,因为在预处理器宏中,Xcode已设置DEBUG=1。
因此,您可以使用#if DEBUG“开箱即用”。
顺便说一句,苹果的《Swift编程语言4.1》一书(编译器控制语句一节)中写了如何使用条件编译块,而如何编写编译标志以及Swift中C宏的对应内容,则在另一本苹果的《将Swift与Cocoa和Objective C结合使用》一书中(预处理器指令一节)
希望未来苹果会为他们的书写更详细的内容和索引。