首页 文章

在没有预处理器宏的情况下,有没有办法在Xcode项目中的项目级别定义实用的方案特定标志

提问于
浏览
167

在快速之前,我将为alpha,beta和分发版本定义一组方案 . 这些方案中的每一个都有一组宏,这些宏被定义为在项目级别处理某些行为 . 最简单的示例是DEBUG = 1宏,默认情况下为Run构建的默认方案中的所有Xcode项目定义 . 可以查询#ifdef DEBUG ...并相应地在代码中做出决定,甚至编译出非必要的代码 .

看起来这种类型的配置选通并不像使用swift那么容易,因为不支持宏 . 有人可以建议一个类似的方法,我不在乎代码是否编译出来,本身 . 不过,我想基于构建方案来构建功能 .

4 回答

  • 29

    在Swift中,您仍然可以使用"#if/#else/#endif"预处理器宏(尽管更受约束),如Apple docs . 这是一个例子:

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

    现在,您必须在其他位置设置"DEBUG"符号 . 将其设置在"Swift Compiler - Custom Flags"部分,"Other Swift Flags"行 . 使用 -D DEBUG 条目添加DEBUG符号 .

    (构建设置 - > Swift编译器 - 自定义标志)
    enter image description here

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

    我用实际代码测试了它;它似乎没有在操场上被认出来 .

  • 447

    我们遇到了一个不想设置swift编译器标志的问题,因为我们不想设置它们并让它们保持最新的不同目标等 . 另外,在我们的混合代码库中,我们不想记住为每种语言始终适当地设置标志 .

    对于我们,我们在ObjC中声明了一个文件

    PreProcessorMacros.h

    extern BOOL const DEBUG_BUILD;
    

    在他们中

    PreProcessorMacros.m

    #ifdef DEBUG
        BOOL const DEBUG_BUILD = YES;
    #else
        BOOL const DEBUG_BUILD = NO;
    #endif
    

    然后,在您的Objective-C桥接 Headers 中

    #import "PreProcessorMacros.h"
    

    现在,在Swift代码库中使用它

    if DEBUG_BUILD {
        println("debug")
    } else {
        println("release")
    }
    

    这绝对是一种解决方法,但它解决了我们的问题所以我在这里发布它希望它会有所帮助 . 这并不意味着现有答案无效 .

  • 6

    Logans方法更加巧妙的解决方案 . 在目标的构建设置中 Other Swift FlagsOther Swift Flags 中设置 -D DEBUG .

    然后在全局范围内声明以下方法:

    #if DEBUG
    let isDebugMode = true
    #else
    let isDebugMode = false
    #endif
    

    现在用它作为

    if isDebugMode {
        // Do debug stuff
    }
    
  • 0

    我正在使用混合语言代码库,其中obj-c代码使用宏将调试消息发送到控制台(该宏依赖于我们的调试预处理器标志) . 我希望能够在swift代码中调用相同的宏...

    • 我在我的一个obj-c类上创建了一个类方法,它是该宏的包装器 .

    • 我将obj-c标头添加到我们的桥头文件中 .

    • 现在我的swift代码将该类方法调用为obj-c宏的"proxy" .

    有点烦人的是,我不能直接在快速代码中调用宏,但至少现在我只在项目中有一个位置担心打开/关闭调试标志 .

相关问题