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 ConditionsOther 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,因为NSStringlastPathComponent属性用起来更加便捷。

注意:在Swift中是没有宏的。

posted on 2022-05-13 11:46  梁飞宇  阅读(555)  评论(0)    收藏  举报