swift - 实用Log 输出
2020-06-02 本文已影响0人
31313_iOS
在Swift中我们最常用的输出方法是使用print
,在控制台输出一些字符串或者值,助于我们更好的了解程序的工作、程序运行中发生的一些变化、查看一些重要的数据输出等等。在程序比较简单的时候,我们要查找输出还是比较简单,但是对于复杂的程序和输出内容很多的时候,想要找到我们想看的数据其实就没有那么方便了。这时候我们就希望能够更精确的输出,比如包括输出的文件、调用的方法、调用的行号
等。
当然我们也可以在输出的时候自己加上这些:
func printTestMethod() {
print("⽂件名:xxx.swift, ⽅法名:method,行号:[line]: 这是⼀条输出")
}
但是这样确实很麻烦,每次输⼊⽂件名和⽅法名和行号,随着代码的修改,我们就要不停的需要维护这个输出,代价很大。
为了解决这个难题,就出现了今天要介绍的方式。
在Swift中,编译器为我们准备了⼏个很有⽤的编译符号,⽤来处理类似这样的需求,它们分别 是:
符号 | 类型 | 描述 |
---|---|---|
#fie |
String | 包含这个符号的⽂件的路径 |
#line |
Int | 符号出现处的⾏号 |
#column |
Int | 符号出现处的列 |
#function |
String | 包含这个符号的⽅法名字 |
我们利用这写编译符号就可以定义出一个比较实用的Log
输出方法:
func print_log<T>(_ message:T, file: String = #file, method: String = #function, line: Int = #line)
func print_log<T>(_ message:T, file: String = #file, method: String = #function, line: Int = #line) {
print("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")
}
验证一下效果,在用户点击的时候输出看小效果:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(myView)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print_log("这是一个自己定义的输出--")
print("----------------------------")
print("这是一个系统的输出--")
}
输出结果为:
ViewController.swift[19], touchesBegan(_:with:): 这是一个自己定义的输出--
----------------------------
这是一个系统的输出--
当然我们很多时候希望 Release
版本中关闭所有的输出,那我们可以小优化一下, 用#if DEBUG --- code --- #endif
:
func print_log<T>(_ message:T, file: String = #file, method: String = #function, line: Int = #line) {
#if DEBUG
print("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")
#endif
}
新版本的 LLVM 编译器在遇到这个空⽅法时,甚⾄会直接将这个⽅法整个去掉,完全不去调⽤ 它,从⽽实现零成本。