条件编译:顾名思义,就是在一定条件下才会编译
// 操作系统: macOS iOS tvOS watchOS Linux Android Windows FreeBSD
#if os(macOS) || os(iOS)
// CPU架构: i386 x86_64 arm arm64
#elseif arch(x86_64) || arch(arm64)
// swift版本
#elseif swift(<5) && swift(>=3)
// 模拟器
#elseif targetEnvironment(simulator)
// 可导入某模块
#elseif canImport(Foundation)
#else
// 这里放其他条件代码
#endif
iOS中CPU架构
模拟器:
i386:iphone5/iphone5c以下的模拟器
x86_64:iPhone5s以上的模拟器
真机:
armv6:iPhone、iPhone2、iPhone3G、iPod Touch(第一代)、iPod Touch(第二代)
armv7:iPhone3Gs、iPhone4、iPhone4s、iPad、iPad 2
armv7s:iPhone5、iPhone5c
arm64:iPhone5s、iPhone6、iPhone6p、iPhone6s、iPhone6sp、iPhone7、iPhone7p、iPhone8、iPhone8p、iPhoneX
arm64e:iPhone XS、iPhone XS Max、iPhone XR
即:
模拟器32位处理器需要i386架构
模拟器64位处理器需要x86_64架构 (x86_64后缀64,说明处理器是64位)
真机32位处理器需要armv7,或者armv7s架构
真机64位处理器需要arm64,或者arm64e架构 (arm64后缀是64,说明处理器是64位)
Swift中比较常用DEBUG条件
#if DEBUG
// 比如DEBUG模式下打印
// 封装的日志输出功能(T表示不指定日志信息参数类型)
public func DLog<T>(_ message:T, file:String = #file, function:String = #function,
line:Int = #line) {
#if DEBUG
let fileName = (file as NSString).lastPathComponent
if message is Dictionary<String, Any> {
print("[\(fileName):line:\(line)]- \((message as! Dictionary<String, Any>).myDescription(level: 0))")
}else if message is Array<Any> {
print("[\(fileName):line:\(line)]- \((message as! Array<Any> ).myDescription(level: 0))")
}else if message is CustomStringConvertible {
print("[\(fileName):line:\(line)]- \((message as! CustomStringConvertible).description)")
}else {
print("[\(fileName):line:\(line)]- \(message)")
}
#endif
}