Swift中能否将#if语句用到的宏分组为宏数组统一管理
问题解答
是否支持你描述的写法
Swift 不支持 C/Objective-C 中使用
#define定义组合编译条件的语法,你示例的用#define定义数组形式分组宏的写法无法直接在 Swift 中使用。
可行的替代方案
方案1:在编译配置中直接添加分组标记(推荐)
这种方案不需要修改业务代码,维护成本最低:
- 对于属于分组1的所有目标(Target#1、Target#2、Target#3),在
TARGETS -> 对应目标名称 -> Build Settings -> Other Swift Flags中额外添加编译标记-D TARGETS_FOR_OPTION_1 - 对于属于分组2的所有目标,额外添加编译标记
-D TARGETS_FOR_OPTION_2
配置完成后就可以直接在代码中使用你期望的判断逻辑:
#if TARGETS_FOR_OPTION_1 DoSomething() #elseif TARGETS_FOR_OPTION_2 DoSomethingElse() #endif
后续如果要调整目标所属的分组,只需要修改对应目标的编译配置即可,不需要修改任何代码。
方案2:在代码中统一维护分组映射
如果不想修改编译配置,可以在全局通用的代码文件中提前定义好分组的编译判断:
// 全局统一维护的目标分组判断 #if Target1 || Target2 || Target3 fileprivate let isOption1Target = true #else fileprivate let isOption1Target = false #endif #if Target4 || Target5 || Target6 fileprivate let isOption2Target = true #else fileprivate let isOption2Target = false #endif
业务代码中直接调用即可:
if isOption1Target { DoSomething() } else if isOption2Target { DoSomethingElse() }
注意:上述常量是编译期确定的静态值,Swift 编译器会自动裁剪未命中的代码分支,和原生
#if编译指令的执行效率完全一致,没有额外运行时开销。
额外提醒
你当前使用的 Target#1 这类编译标记包含特殊符号 #,不符合 Swift 编译标记的命名规范(仅支持字母、数字、下划线),建议调整为 Target1 这类合法命名,避免编译报错。
内容的提问来源于stack exchange,提问作者ytpm
相关产品推荐
相关产品推荐

