Swift语言中的#ifdef替换

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

#ifdef DEBUG
    // Debug-only code
#endif

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


是的,你可以做到。

在Swift中,您仍然可以使用“#if /#else /#endif”预处理器宏(尽管受到更多约束),正如Apple文档所述。 这是一个例子:

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

现在,您必须在别处设置“DEBUG”符号。 将其设置在“Swift编译器 - 自定义标志”部分,“其他Swift标志”行中。 使用-D DEBUG条目添加DEBUG符号。

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

我用真实代码对它进行了测试, 但它似乎并未在游乐场中得到认可。

你可以在这里阅读我的原文。


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


正如Apple Docs所述

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

我已经设法通过使用自定义生成配置来实现我想要的功能:

  • 转到您的项目/选择您的目标/构建设置/搜索自定义标志
  • 对于您选择的目标,使用-D前缀(无空白)设置您的自定义标志,用于调试和发布
  • 针对每个目标执行上述步骤
  • 以下是你如何检查目标:

    #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。

    我需要假数据和处理它的不同方式。 我有两个环境变量:一个在打开时告诉应用程序在我的设备上运行时从实际数据中生成假数据; 另一个在打开时在模拟器上运行时使用假数据(而不是丢失的音乐库)。 通过Scheme编辑器中的环境变量复选框,可轻松切换每个特殊模式。 奖金是我不会在我的App Store内部意外地使用它们,因为归档没有环境变量。

    链接地址: http://www.djcxy.com/p/56483.html

    上一篇: #ifdef replacement in the Swift language

    下一篇: Google Protocol Buffers: parseDelimitedFrom and writeDelimitedTo for C++