在C/C++/Objective C中,可以使用编译器预处理器定义宏。此外,您可以使用编译器预处理器包含/排除代码的某些部分。
#ifdef DEBUG
// Debug-only code
#endif
Swift中有类似的解决方案吗?
在C/C++/Objective C中,可以使用编译器预处理器定义宏。此外,您可以使用编译器预处理器包含/排除代码的某些部分。
#ifdef DEBUG
// Debug-only code
#endif
Swift中有类似的解决方案吗?
当前回答
在许多情况下,您实际上不需要条件编译;您只需要可以打开和关闭的条件行为。为此,您可以使用环境变量。这有一个巨大的优点,你实际上不需要重新编译。
您可以在方案编辑器中设置环境变量,并轻松地将其打开或关闭:
您可以使用NSProcessInfo检索环境变量:
let dic = NSProcessInfo.processInfo().environment
if dic["TRIPLE"] != nil {
// ... do secret stuff here ...
}
这是一个现实生活中的例子。我的应用程序只在设备上运行,因为它使用的是模拟器上不存在的音乐库。那么,如何在模拟器上拍摄我不拥有的设备的屏幕快照?没有这些屏幕截图,我无法提交到AppStore。
我需要假数据和不同的处理方式。我有两个环境变量:一个是当打开时,告诉应用程序在我的设备上运行时从真实数据生成假数据;另一个,当打开时,在模拟器上运行时使用假数据(而不是丢失的音乐库)。由于Scheme编辑器中的环境变量复选框,打开/关闭这些特殊模式很容易。另外一个好处是,我不会在我的App Store构建中意外使用它们,因为归档没有环境变量。
其他回答
Xcode 8及以上
使用Build设置/Swift编译器-自定义标志中的Active Compilation Conditions设置。
这是将条件编译标志传递给Swift编译器的新构建设置。简单地添加如下标志:ALPHA、BETA等。
然后使用如下编译条件进行检查:
#if ALPHA
//
#elseif BETA
//
#else
//
#endif
提示:您也可以使用#if!ALPHA等。
没有Swift预处理器。(一方面,任意代码替换破坏了类型和内存安全。)
不过,Swift确实包含了构建时配置选项,因此您可以有条件地包含某些平台或构建样式的代码,或者响应您使用-D编译器参数定义的标志。但是,与C不同,代码的有条件编译部分必须在语法上完整。在将Swift与Cocoa和Objective-C结合使用中有一节介绍了这一点。
例如:
#if os(iOS)
let color = UIColor.redColor()
#else
let color = NSColor.redColor()
#endif
马特回答的Swift 5更新
let dic = ProcessInfo.processInfo.environment
if dic["TRIPLE"] != nil {
// ... do your secret stuff here ...
}
![在Xcode 8及以上版本中,转到构建设置->搜索自定义标志]1
在代码中
#if Live
print("Live")
#else
print("debug")
#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