Swift开发小技巧系列 - 改造print函数

正文

在实际开发中,print函数应该是我们最常用到的调试手段。使用非常灵活简单。但有的时候就是不够那么方便。在开发中主要体现在以下两点:

  • 显示log语句的具体位置,即在哪个文件的哪个函数的哪一行
  • 在release版本中,自动失效

下面我们就针对以上两点来进行对print函数的改造。

1
2
3
public func debugPrintLog(_ message: Any, file: String = #file, function: String = #function, line: Int = #line) {
print("\((file as NSString).lastPathComponent):\(function):\(line) -> \(message)")
}

自定义了一个debugPrintLog来替代原来的print函数,这个函数除了要传入输出的内容,还要三个参数:文件路径,函数名和代码行数。当然我们绝大多数时候只要使用默认参数就可以了。使用起来也很简单,看效果。

1
2
3
4
5
6
7
// PrintHelperViewController.swift

func testPrintLog() {
debugPrintLog("Hello, World!")
}

// 输出结果: PrintHelperViewController.swift:testPrintLog():20 -> Hello, World!

这时候我们就解决了第一个问题。其实这里我们还可以继改进下,我们在实际开发时,会一些情况,我
只想确定某些方法有没有被调用,不想输出其它信息,毕竟每次思考输出什么文字也是件头疼的事。

1
2
3
public func debugPrintLog(_ message: Any? = nil, file: String = #file, function: String = #function, line: Int = #line) {
print("\((file as NSString).lastPathComponent):\(function):\(line) -> \(message)")
}
1
2
3
4
5
6
7
// PrintHelperViewController.swift

func testPrintLog() {
debugPrintLog()
}

// 输出结果: PrintHelperViewController.swift:testPrintLog():20

第一个问题解决,我们开始解决第二个问题。

1
2
3
4
5
6
7
8
9
public func debugPrintLog(_ message: Any? = nil, file: String = #file, function: String = #function, line: Int = #line) {
#if DEBUG
if let message = message {
print("\((file as NSString).lastPathComponent):\(function):\(line) -> \(message)")
} else {
print("\((file as NSString).lastPathComponent):\(function):\(line)")
}
#endif
}

思路也很简单,我们让输出语句只在DEBUG模式有效。改造结束,到此为止,我们就完成了一个解决特定需求的输出函数debugPrintLog

参考资料

联系方式

备注

我们在软件开发的过程中,为了提高效率,其中很重要的一环就是把反复使用到的功能或模块封装起来。因此我在GitHub上开源了一个小工具集 - SwiftDevHints,来总结自己在实际项目开发过程中封装的一些小功能。

刚刚介绍的只是其中一个小功能,想看看其它更多功能,请直接点击SwiftDevHints。如果您觉得对您有所帮助,请给一个star吧。