条件编译:顾名思义,就是在一定条件下才会编译

// 操作系统: 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架构

模拟器:
i386iphone5/iphone5c以下的模拟器
x86_64iPhone5s以上的模拟器

真机
armv6iPhoneiPhone2iPhone3GiPod Touch(第一代)iPod Touch(第二代)

armv7iPhone3GsiPhone4iPhone4siPadiPad 2

armv7siPhone5iPhone5c

arm64iPhone5siPhone6iPhone6piPhone6siPhone6spiPhone7iPhone7piPhone8iPhone8piPhoneX

arm64eiPhone XSiPhone XS MaxiPhone 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
}