在Objective-C项目中,用过预处理器宏(Preprocessor Macros)的同学都知道方便所在。
举个栗子:
当我们项目中的http请求域名也就是baseUrl要分为线上环境和开发环境,那怎么进行切换才方便呢,这时候我会把Target中对应的项目右键创建一份副本命名为:XXXDevelop, 原来的那份命名为XXXProduct. Plist再对应设置下,命名清晰后以后就可以明确进行切换了!
OK,接下来就是使用OC中的预编译宏了:
我将Develop中宏设置为MYSERVICE=0,Product中设置为1进行区分
这样就能在项目中进行有效判断了:
是不是很简单快捷,想切换开发环境、生产环境只需选择相应的Target就ok、
以上是简单回顾完OC中使用后,我在新Swift项目中也想按照这个思路进行使用,不过杯具了,虽然之前了解到Swift中没有宏定义的概念,但还好 #if 这一套编译还能用,但 #if 后面进行等式判断貌似不好使了,试不出来只能好好查下资料了:
1.在之前OC时代(编译器是clang),条件编译所用到的变量定义,都是通过:GCC_PREPROCESSOR_DEFINITIONS的Preprocessor Macros去定义的;
2.后来swift中(编译器是swiftc),最开始时是用:OTHER_SWIFT_FLAGS的Other Swift Flags中定义的(加上-DXXX)
3.Xcode 8中又更新为,换用SWIFT_ACTIVE_COMPILATION_CONDITIONS的Active Compilation Conditions去定义变量XXX即可(不需要加-D)。
难怪!!有很多之前文章-DXXX之类的,并且也只是设置为0或1进行判断,如果还有预发布环境Url呢?或者有很多值的判断呢?
有了3的说法,就不需要多纠结,直接Build Settings中直接查找"Active Compilation Condition" 设置字符串就好了,避免掉设置数值。
并且也不需要更改"Other Swift Flags"中的任何设置~
最后只要在你的Swift 文件中进行判断就OK了!