天天看點

Swift 條件編譯

在 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)