协慌网

登录 贡献 社区

Swift 语言中的 #ifdef 替换

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

#ifdef DEBUG
    // Debug-only code
#endif

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

答案

是的,你可以做到。

在 Swift 中,按照 Apple docs 的规定,您仍然可以使用 “#if /#else /#endif” 预处理器宏(尽管有更多限制)。这是一个例子:

#if DEBUG
    let a = 2
#else
    let a = 3
#endif

现在,您必须在其他位置设置 “DEBUG” 符号。在 “Swift 编译器 - 自定义标志” 部分的 “其他 Swift 标志” 行中进行设置。您将 DEBUG 符号与-D DEBUG条目一起添加。

与往常一样,您可以在 Debug 或 Release 中设置不同的值。

我用真实代码对其进行了测试,并且可以正常工作。它似乎在操场上似乎未被认可。

您可以在这里阅读我的原始帖子。


重要说明: -DDEBUG=1不起作用。仅-D DEBUG有效。似乎编译器正在忽略具有特定值的标志。

Apple Docs 中所述

Swift 编译器不包含预处理器。相反,它利用编译时属性,构建配置和语言功能来实现相同的功能。因此,预处理器指令不会导入到 Swift 中。

通过使用自定义构建配置,我设法实现了想要的目标:

  1. 转到项目 / 选择目标 / 构建设置 / 搜索自定义标志
  2. 对于所选目标,使用 - D 前缀(不带空格)设置调试和发布的自定义标志
  3. 对您拥有的每个目标执行上述步骤

检查目标的方法如下:

#if BANANA
    print("We have a banana")
#elseif MELONA
    print("Melona")
#else
    print("Kiwi")
#endif

在此处输入图片说明

使用 Swift 2.2 进行了测试

在许多情况下,您实际上并不需要条件编译;您只需要可以打开和关闭的条件行为即可。为此,您可以使用环境变量。这具有巨大的优势,您实际上不必重新编译。

您可以在方案编辑器中设置环境变量,并轻松地将其打开或关闭:

在此处输入图片说明

您可以使用 NSProcessInfo 检索环境变量:

let dic = NSProcessInfo.processInfo().environment
    if dic["TRIPLE"] != nil {
        // ... do secret stuff here ...
    }

这是一个真实的例子。我的应用程序仅在设备上运行,因为它使用的音乐库在模拟器上不存在。那么,如何在模拟器上为我不拥有的设备拍摄屏幕快照?没有这些屏幕截图,我将无法提交到 AppStore。

我需要伪造数据其他处理方式。我有两个环境变量:一个在打开时告诉应用程序在我的设备上运行时从真实数据中生成伪造的数据。另一种是在模拟器上运行时打开时使用伪造的数据(而不是缺少的音乐库)。通过使用方案编辑器中的环境变量复选框,可以轻松打开 / 关闭这些特殊模式。而且好处是,我无法在 App Store 构建中意外使用它们,因为归档没有环境变量。