應(yīng)用場景
在項目工程中編寫代碼唯咬,但是需要對部分功能做區(qū)分處理(系統(tǒng)贮缕、設(shè)備等)韩脏。就需要使用系統(tǒng)的條件編譯方式來處理宁否。
API 及語言
Swift
核心邏輯/代碼
主要是通過#if xx #elseif xxx #else xx #endif
條件編譯代碼實現(xiàn)窒升。條件中 xx
需要使用系統(tǒng)已經(jīng)定義的。
條件編譯的工程設(shè)置
可以在 target -> Bulid Settings -> swift compiler - custom flage
選項下的 Active compilation Conditions
中設(shè)置條件編譯的標(biāo)示慕匠,比DEBUG
或者自定義 TEST
饱须。也可以在Other Swift Flags
選項下添加標(biāo)示(需要在標(biāo)示前添加 -D
)
系統(tǒng)版本檢測
使用if #available(*,*,*){}
代碼條件檢測系統(tǒng)版本,若為 true台谊,則執(zhí)行操作
API 可用性說明
設(shè)置類蓉媳、結(jié)構(gòu)體譬挚、函數(shù)等設(shè)置系統(tǒng)限制,或者不可使用等說明酪呻,在調(diào)用的時候减宣,Xcode 會提示。核心代碼就是使用 @available()
代碼玩荠。
示例代碼
設(shè)置條件代碼
// 操作系統(tǒng):macOS/iOS/tvOS/watchOS/Linux/Android/Windows/FreeBSD
#if os(macOS) || os(iOS)
// CPU構(gòu)架:i386\x86_64\arm\arm64
#elseif arch(x86_64) || arch(arm64)
// swift 版本
#elseif swift(<5) && swift(>=3)
// 模擬器
#elseif targetEnvironment(simulator)
// 可以導(dǎo)入某模塊
#elseif canImport(Foundation)
#else
#endif
系統(tǒng)版本檢測
if #available(iOS 10, macOS 10.12, *) {
// 對于 iOS 平臺漆腌,只在 iOS10 及以上版本執(zhí)行
// 對于 macOS 平臺,只在 macOS 10.12 及以上版本執(zhí)行
// 最后的 * 標(biāo)示在其他所有平臺都執(zhí)行
}
API 可用性說明
/// 僅在 iOS 10 或者 macOS 10.15 及以上使用
@available(iOS 10, macOS 10.15, *)
class Person {}
struct Student {
// study_ 方法不可用阶冈,使用 study
@available(*, unavailable, renamed: "study")
func study_() {}
func study() {}
// 在 iOS 11 或者 macOS 10.12 及以上版本不可以使用 run 函數(shù)
@available(iOS, deprecated: 11)
@available(macOS, deprecated: 10.12)
func run() {}
}