这儿每天共享一个 iOS 的新知识,快来重视我吧
条件编译
条件编译指的是你能够在编译阶段决定运用哪些代码,在 swift 中能够运用 #if
关键字来运用条件编译。
条件编译和一般的 if
句子类似,不过是以 #if
开头,以 #endif
编译指令完毕。比方一个简略的条件编译代码如下:
#if os(macOS)
// 当时环境为 macOS
#endif
条件编译的优点
条件编译的主要优点是当你的同一套代码需求编译在不同渠道/体系/设备(比方 iOS / macOS / watchOS)时,或许相同的功能实现方法不同,这时候就需求用条件编译来解决渠道差异。
另一个优点是条件编译是在编译期间完成的,多个条件分支下打出的包最终一般只会包括其中一个分支。
现在支撑的条件
最近统计了一下现在在 swift 中能够用到的所有条件编译,共享给我们,期望你们在项目中能够用上。
1、判别体系
运用方法:os(Platform
)
Platform 参数可选值为:macOS
| iOS
, watchOS
| tvOS
| Linux
| Windows
。
2、判别体系架构
运用方法:arch(Arch
)
Arch 参数可选值为:i386
, x86_64
, arm
, arm64
。
3、判别 swift 版别
运用方法:swift(version
)
version 参数的值为对某个 swift 版别的巨细判别,能够运用 >= 或 <,后跟版别号。比方:
#if swift(>=5)
// 大于等于 swift 5.0 的版别
#endif
#if swift(>=4.2)
// 大于等于 swift 4.2 的版别
#endif
4、判别编译器版别
运用方法:compiler(version
)
version 参数的值为对某个编译器版别的巨细判别,能够运用 >= 或 < 后跟版别号。比方:
#if compiler(>=5)
// 运用 Swift 5 或更高版别编译
#endif
5、判别是否能够导入某个模块
运用方法:canImport(module
)
module 参数的值为某个模块称号。比方我要判别是否当时环境是否能够运用 Kingfisher
模块:
#if canImport(Kingfisher)
// 能够运用 Kingfisher 模块
#endif
6、判别目标环境
运用方法:targetEnvironment(env
)
env 参数能够选用的值为有 simulator
| macCatalyst
,比方我要判别当时运转环境是否为模拟器:
#if targetEnvironment(simulator)
// 当时运转在模拟器上
#endif
这个在判别当时设备是模拟器仍是真机的文章中介绍过。
运用
正常的运用上边展示的那些事例就够了,还有一些其他的用法值得一提。
这些条件编译指令是能够混合运用的,运用方法和一般的条件判别相同,用 && 和 ||,比方我要判别在模拟器下而且能够运用 UIKit 而且 swift 版别大于 5.0:
#if targetEnvironment(simulator) && swift(>=5.0) && canImport(UIKit)
// 在模拟器上运转而且swift 版别大于 5.0,而且能够运用 UIKit 库
#endif
也能够运用感叹号 !来做取反操作:
#if !os(iOS)
// 当时环境不是 iOS
#endif
还能够运用 elseif
| else
来做多分支判别:
#if os(iOS)
// iOS
#elseif os(macOS)
// macOS
#elseif os(watchOS)
// watchOS
#elseif os(tvOS)
// tvOS
#elseif os(Linux)
// Linux
#elseif os(Windows)
// Windows
#else
// 其他体系
#endif
点击下方大众号卡片,重视我,每天共享一个关于 iOS 的新知识
本文同步自微信大众号 “iOS新知”,每天按时共享一个新知识,这儿仅仅同步,想要及时学到就来重视我吧!