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

ban*_*edo 173 ios swift

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

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

Jea*_*nan 458

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

#if DEBUG
    let a = 2
#else
    let a = 3
#endif
Run Code Online (Sandbox Code Playgroud)

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

(构建设置 - > Swift编译器 - 自定义标志) 在此输入图像描述

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

我用实际代码测试了它; 它似乎没有在操场上得到认可.

  • 注意:"内置设置 - > Swift编译器 - >自定义标志"在"基本"构建设置中不可见.必须显示"全部"构建设置才能显示. (10认同)
  • 在Xcode 8中,现在在"Swift编译器 - 自定义标志"部分中还有一个"活动编译条件"设置.您可以在此处添加标志而无需-D (10认同)
  • @EugeneDubinin可能是因为你应该确保在目标设置中使用`$(inherited)`来继承项目设置. (7认同)
  • 请注意,您还可以使用#elseif行添加更多测试.有趣的是,您可以访问定义但不从中提取任何内容; 也就是说,定义-DDEBUG = 5(或="FOO"),然后尝试使用"println(DEBUG is \(DEBUG \)"打印它.该行不会产生任何错误,但不会执行任何操作. (5认同)
  • @DanSkeel好看,添加`$(继承)`让我的评论无关紧要,谢谢! (2认同)
  • 小而重要的旁注:他们必须在首都! (2认同)
  • 您是如何设置绿色的构建设置中的选定行? (2认同)
  • @JuanFranJimenez 绿色实际上是全局 macOS 高亮颜色的结果。查看系统偏好设置 -> 常规 (2认同)

Log*_*gan 33

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

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

PreProcessorMacros.h

extern BOOL const DEBUG_BUILD;
Run Code Online (Sandbox Code Playgroud)

在他们中

PreProcessorMacros.m

#ifdef DEBUG
    BOOL const DEBUG_BUILD = YES;
#else
    BOOL const DEBUG_BUILD = NO;
#endif
Run Code Online (Sandbox Code Playgroud)

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

#import "PreProcessorMacros.h"
Run Code Online (Sandbox Code Playgroud)

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

if DEBUG_BUILD {
    println("debug")
} else {
    println("release")
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Berik - 我发布了一个有效的解决方案,希望它也可以帮助其他人尝试解决这个问题的一个方面,特别是在多语言项目中.如果您的问题不需要编译特定的代码,那就没问题.评论也很好,特别是当它教育一些为什么这可能不是他们的解决方案时.还要求在答案中记下这种方法的局限性.下注是不必要的,并且不鼓励可能有助于其他人解决类似问题的替代解决方案.另外,op说"我不在乎代码是否被编译出来". (18认同)
  • 宏的重点是根据构建配置更改代码.您将if带回运行时,您不需要宏. (11认同)

Sah*_*oor 7

Logans方法更加巧妙的解决方案.设置目标的构建设置-D DEBUGOther Swift FlagsSwift Compiler - Custom Flags部分.

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

#if DEBUG
let isDebugMode = true
#else
let isDebugMode = false
#endif
Run Code Online (Sandbox Code Playgroud)

现在用它作为

if isDebugMode {
    // Do debug stuff
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*iri 5

对我来说,将“ Active Compilation Condition ”的调试项设置为“DEBUG”是有效的。

然后使用 DEBUG 键可以在 #IF DEBUG 在调试模式下工作,在发布模式下使用 #ELSE:

  1. 选择你的目标,

  2. 在“构建设置”选项卡中搜索“活动编译条件”,

  3. 将其“Debug”项的值设置为“YourKeyWord”,

  4. 简单使用如下:

    #if DEBUG
        print("You'r running in DEBUG mode!")
    #else
        print("You'r running in RELEASE mode!")
    #endif
    
    Run Code Online (Sandbox Code Playgroud)