在 C 系語言中,可以使用
#if
或者
#ifdef
之類的編譯條件分支來控制哪些代碼需要編譯,而哪些代碼不需要。Swift 中沒有宏定義的概念,是以我們不能使用 #ifdef 的方法來檢查某個符号是否經過宏定義。但是為了控制編譯流程和内容,Swift 還是為我們提供了幾種簡單的機制來根據需求定制編譯内容的。
首先是
#if
這一套編譯标記還是存在的,使用的文法也和原來沒有差別:
#if <condition>
#elseif <condition>
#else
#endif
當然,
#elseif
和
#else
是可選的。
但是這幾個表達式裡的
condition
并不是任意的。Swift 内建了幾種平台和架構的組合,來幫助我們為不同的平台編譯不同的代碼,具體地:
- 方法 os(),可選參數 OSX, iOS
- 方法 arch(),可選參數 x86_64, arm, arm64, i386
注意這些方法和參數都是大小寫敏感的。舉個例子,如果我們統一我們在 iOS 平台和 Mac 平台的關于顔色的 API 的話,一種可能的方法就是配合
typealias
進行條件編譯:
#if os(OSX)
typealias Color = NSColor
#else
typealias Color = UIColor
#endif
另外對于
arch()
的參數需要說明的是
arm
和
arm64
兩項分别對應 32 位 CPU 和 64 位 CPU 的真機情況,而對于模拟器,相應地 32 位裝置的模拟器和 64 位裝置的模拟器所對應的分别是 i386 和 x86_64,它們也是需要分開對待的。
另一種方式是對自定義的符号進行條件編譯,比如我們需要使用同一個 target 完成同一個 app 的收費版和免費版兩個版本,并且希望在點選某個按鈕時收費版本執行功能,而免費版本彈出提示的話,可以使用類似下面的方法:
@IBAction func someButtonPressed(sender: AnyObject!) {
#if FREE_VERSION
// 彈出購買提示,導航至商店等
#else
// 實際功能
#endif
}
在這裡我們用
FREE_VERSION
這個編譯符号來代表免費版本。為了使之有效,我們需要在項目的編譯選項中進行設定,在項目的 Build Settings 中,找到
Swift Compiler - Custom Flags
,并在其中的
Other Swift Flags
加上
-D FREE_VERSION
就可以了。
來源:http://swifter.tips/condition-compile/ 作者:王巍 (@onevcat)