swift小知识之条件编译
一,支持条件编译:
Swift支持条件编译的内容是不多的,大概就是下面这些:// 操作系统: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
二,自定义编译标记:
Xcode
默认有一个DEBUG
标记,我们也可以自己添加一个新的标记。Active Compilation Conditions
和Other Swift Flags
没有多大区别,只是在Other Swift Flags
区域增加标记时需要在最前面加上-D
。
#if DEBUG // debug模式 #else // release模式 #endif
#if TEST print("test") #endif
#if OTHER print("other") #endif
在OC中是可以通过不同编译条件定义不同的宏,来控制不同环境下NSLog
是否有效。但是在Swift中只能通过定义一个新的函数,通过不同环境的编译标记让其运行:
func log(_ msg: String) { #if DEBUG print(msg) #endif }
我们不需要考虑在Release
环境下是否有多余log
函数占内存。因为编译器会自动做内联优化。
自定义精准打印:
func log(_ msg: String, file: NSString = #file, line: Int = #line, fn: String = #function) { #if DEBUG let prefix = "from:\(file.lastPathComponent)_line:\(line)_fn:\(fn):" print(prefix, msg) #endif } func test() { log("测试信息") } test() // 输出:from:main.swift_line:20_fn:test(): 测试信息
如果在log
函数内部直接使用print(#file, #line, #function, msg)
,每次打印都是同样的文件、同一行,同一个log
函数。因为#file, #line, #function
捕捉的是当前函数的环境。
为什么要使用OC的NSString
,因为NSString
的lastPathComponent
属性用起来更加便捷。
注意:在Swift中是没有宏的。