在 C 系語言中慕趴,可以使用 #if 或者 #ifdef 之類的編譯條件分支來控制哪些代碼需要編譯,而哪些代碼不需要赤赊。Swift 中沒有宏定義的概念吵血,因此我們不能使用 #ifdef 的方法來檢查某個(gè)符號是否經(jīng)過宏定義。但是為了控制編譯流程和內(nèi)容扼睬,Swift 還是為我們提供了幾種簡單的機(jī)制來根據(jù)需求定制編譯內(nèi)容的逮栅。
首先是 #if 這一套編譯標(biāo)記還是存在的,使用的語法也和原來沒有區(qū)別:
#if <condition>
#elseif <condition>
#else
#endif
當(dāng)然窗宇,#elseif 和 #else 是可選的证芭。
但是這幾個(gè)表達(dá)式里的 condition 并不是任意的。Swift 內(nèi)建了幾種平臺和架構(gòu)的組合担映,來幫助我們?yōu)椴煌钠脚_編譯不同的代碼,具體地:
方法 可選參數(shù)
os() OSX, iOS
arch() x86_64, arm, arm64, i386
注意這些方法和參數(shù)都是大小寫敏感的叫潦。舉個(gè)例子蝇完,如果我們統(tǒng)一我們在 iOS 平臺和 Mac 平臺的關(guān)于顏色的 API 的話,一種可能的方法就是配合 typealias 進(jìn)行條件編譯:
#if os(OSX)
typealias Color = NSColor
#else
typealias Color = UIColor
#endif
另外對于 arch() 的參數(shù)需要說明的是 arm 和 arm64 兩項(xiàng)分別對應(yīng) 32 位 CPU 和 64 位 CPU 的真機(jī)情況矗蕊,而對于模擬器短蜕,相應(yīng)地 32 位設(shè)備的模擬器和 64 位設(shè)備的模擬器所對應(yīng)的分別是 i386 和 x86_64,它們也是需要分開對待的傻咖。
另一種方式是對自定義的符號進(jìn)行條件編譯朋魔,比如我們需要使用同一個(gè) target 完成同一個(gè) app 的收費(fèi)版和免費(fèi)版兩個(gè)版本,并且希望在點(diǎn)擊某個(gè)按鈕時(shí)收費(fèi)版本執(zhí)行功能卿操,而免費(fèi)版本彈出提示的話警检,可以使用類似下面的方法:
@IBAction func someButtonPressed(sender: AnyObject!) {
#if FREE_VERSION
// 彈出購買提示孙援,導(dǎo)航至商店等
#else
// 實(shí)際功能
#endif
}
在這里我們用 FREE_VERSION 這個(gè)編譯符號來代表免費(fèi)版本。為了使之有效扇雕,我們需要在項(xiàng)目的編譯選項(xiàng)中進(jìn)行設(shè)置拓售,在項(xiàng)目的 Build Settings 中,找到 Swift Compiler - Custom Flags镶奉,并在其中的 Other Swift Flags 加上 -D FREE_VERSION 就可以了础淤。