1、why
在實際開發中我們常常需要區分不同的環境,此處以最簡單的開發與生產環境為例,每次打包通過修改代碼區分不同的環境過于繁瑣,并且如果需要修改的地方過多,忘改了某一處的話就會造成環境不統一,不僅給開發人員增加負擔,對測試同事也是麻煩的一件事。因此,通過預處理宏能很好的解決我們這一問題。
但實際上我們僅僅開發與生產環境是不夠的,往往還需要測試,預上線環境。Xcode使用Build configuration 配置多種項目環境
此外,通過預處理宏也能用于區分不同的target版本。
在C 系語言中,我們可以通過預處理宏定義一些參數,使用#if或者#ifdef編譯條件分支來控制哪些代碼需要編譯,而哪些代碼不需要。但是在swift中沒有宏定義的概念,雖然不能使用 #ifdef 的方法來檢查某個符號是否經過宏定義,但是可以支持“#if/#else/#endif”語句。
2、how
下面我們來介紹下如何自定義環境變量:(有圖更清晰)
Objective-C、C、C++的LLVM預處理宏在Preprocessor Macros處定義。如圖創建工程時已經默認創建好了在Debug時定義DEBUG=1 宏標記。
如果還需要其他控制參數可以雙擊 DEBUG=1 自行添加。
因為swift中沒有宏定義的概念,那么swift中要如何定義呢?
接下來我們介紹一下Xcode8的前后都是如何定義的預處理宏的
Xcode7:創建一個新的工程,打開buildsetting
配置Swift Compiler - Custom Flags,展開Other Swift Flags,在Debug右側輸入“-DDEBUG”。
也可以“-D DEBUG”,但是不能有賦值,如:“-DDEBUG=1” 或 “-D DEBUG=1”都是無效的。
然后就可以在代碼中使用DEBUG進行條件判斷了,添加之前,swift代碼中使用DEBUG無效果,
#if DEBUG
self.view.backgroundColor = UIColor.blueColor()
#endif
Xcode8:新建工程,打開buildsetting
可以看到Swift Compiler -Custom Flags 已經為我們添加好了DEBUG 預處理宏,代碼中可以直接使用DEBUG來判斷是debug還是release模式。
我們可以在Active Compilation Conditions 中繼續添加需要的參數(圖4)
就可以多個參數通過'與或非'組合實現邏輯判斷。
當然也可以繼續在OTHER_SWIFT_FLAGS中配置環境變量。但是有一個不爽的地方就是需要在自定義的變量前增加“-D”后才能使用。
3、more
其實系統給我們設置了很多環境變量宏。
cd到工程目錄
然后
$ xcodebuild -project Test8.xcodeproj -target Test8 -configuration Debug -showBuildSettings > buildSettings.txt
在工程目錄中生成了一個buildSettings.txt文件,其中保存了target "Test8”的所有的環境變量。
以上。
喜歡就關注我吧?(? ? ??)嘿嘿