正文
在实际开发中,print
函数应该是我们最常用到的调试手段。使用非常灵活简单。但有的时候就是不够那么方便。在开发中主要体现在以下两点:
- 显示log语句的具体位置,即在哪个文件的哪个函数的哪一行
- 在release版本中,自动失效
下面我们就针对以上两点来进行对print
函数的改造。
public func debugPrintLog(_ message: Any, file: String = #file, function: String = #function, line: Int = #line) {
print("\((file as NSString).lastPathComponent):\(function):\(line) -> \(message)")
}
自定义了一个debugPrintLog
来替代原来的print
函数,这个函数除了要传入输出的内容,还要三个参数:文件路径,函数名和代码行数。当然我们绝大多数时候只要使用默认参数就可以了。使用起来也很简单,看效果。
// PrintHelperViewController.swift
func testPrintLog() {
debugPrintLog("Hello, World!")
}
// 输出结果: PrintHelperViewController.swift:testPrintLog():20 -> Hello, World!
这时候我们就解决了第一个问题。其实这里我们还可以继改进下,我们在实际开发时,会一些情况,我只想确定某些方法有没有被调用,不想输出其它信息,毕竟每次思考输出什么文字也是件头疼的事。
public func debugPrintLog(_ message: Any? = nil, file: String = #file, function: String = #function, line: Int = #line) {
print("\((file as NSString).lastPathComponent):\(function):\(line) -> \(message)")
}
// PrintHelperViewController.swift
func testPrintLog() {
debugPrintLog()
}
// 输出结果: PrintHelperViewController.swift:testPrintLog():20
第一个问题解决,我们开始解决第二个问题。
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吧。