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 编译器在遇到这个空⽅法时,甚⾄会直接将这个⽅法整个去掉,完全不去调⽤ 它,从⽽实现零成本。

上一篇下一篇

猜你喜欢

热点阅读