美文网首页
swift - 实用Log 输出

swift - 实用Log 输出

作者: 31313_iOS | 来源:发表于2020-06-02 14:37 被阅读0次

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

    相关文章

      网友评论

          本文标题:swift - 实用Log 输出

          本文链接:https://www.haomeiwen.com/subject/vesuzhtx.html