这儿每天共享一个 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新知”,每天按时共享一个新知识,这儿仅仅同步,想要及时学到就来重视我吧!