Swift中的Build Configurations
Build Configurations in Swift
在Objective-C中,我們經(jīng)常使用預(yù)處理指令來幫助我們根據(jù)不同的平臺執(zhí)行不同的代碼,以讓我們的代碼支持不同的平臺,如:
- #if TARGET_OS_IPHONE
- #define MAS_VIEW UIView
- #elif TARGET_OS_MAC
- #define MAS_VIEW NSView
- #endif
在swift中,由于對C語言支持沒有Objective-C來得那么友好(暫時不知swift 2到C的支持如何),所以我們無法像在Objective-C中那樣自如而舒坦地使用預(yù)處理指令。
不過,swift也提供了自己的方式來支持條件編譯,即使用build configurations(構(gòu)建配置)。Build configurations已經(jīng)包含了字面量true和false,以及兩個平臺測試函數(shù)os()和arch()。
其中os()用于測試系統(tǒng)類型,可傳入的參數(shù)包含OSX, iOS, watchOS,所以上面的代碼在swift可改成:
- #if os(iOS)
- typealias MAS_VIEW = UIView
- #elseif os(OSX)
- typealias MAS_VIEW = NSView
- #endif
注:在WWDC 2014的“Sharing code between iOS and OS X”一節(jié)(session 233)中,Elizabeth Reid將這種方式稱為Shimming
遺憾的是,os()只能檢測系統(tǒng)類型,而無法檢測系統(tǒng)的版本,所以這些工作只能放在運行時去處理。關(guān)于如何檢測系統(tǒng)的版本,Mattt Thompson老大在它的Swift System Version Checking一文中給了我們答案。
我們再來看看arch()。arch()用于測試CPU的架構(gòu),可傳入的值包括x86_64, arm, arm64, i386。需要注意的是arch(arm)對于ARM 64的設(shè)備來說,不會返回true。而arch(i386)在32位的iOS模擬器上編譯時會返回true。
如果我們想自定義一些在調(diào)試期間使用的編譯配置選項,則可以使用-D標識來告訴編譯器,具體操作是在”Build Setting”–>“Swift Compiler-Custom Flags”–>“Other Swift Flags”–>“Debug”中添加所需要的配置選項。如我們想添加常用的DEGUB選項,則可以在此加上”-D DEBUG”。這樣我們就可以在代碼中來執(zhí)行一些debug與release時不同的操作,如
- #if DEBUG
- let totalSeconds = totalMinutes
- #else
- let totalSeconds = totalMinutes * 60
- #endif
- 一個簡單的條件編譯聲明如下所示:
- #if build configuration
- statements
- #else
- statements
- #endif
當(dāng)然,statements中可以包含0個或多個有效的swift的statements,其中可以包括表達式、語句、和控制流語句。另外,我們也可以使用&&和||操作符來組合多個build configuration,同時,可以使用!操作符來對build configuration取反,如下所示:
- #if build configuration && !build configuration
- statements
- #elseif build configuration
- statements
- #else
- statements
- #endif
需要注意的是,在swift中,條件編譯語句必須在語法上是有效的,因為即使這些代碼不會被編譯,swift也會對其進行語法檢查。