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

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