swift学习日志—— Log日志
来源:互联网 发布:腾讯电脑管家 游戏优化 编辑:程序博客网 时间:2024/05/21 17:37
Log 输出是程序开发中很重要的组成部分,虽然它并不是直接的业务代码,但是却可以忠实地反映我们的程序是如何工作的,以及记录程序运行的过程中发生了什么。在OC中的Log日志设置请看我的另一篇博客:设置Log日志打印开关
在 Swift 中,最简单的输出方法就是使用 print
,在我们关心的地方输出字符串和值。但是这并不够,试想一下当程序变得非常复杂的时候,我们可能会输出很多内容,而想在其中寻找到我们希望的输出其实并不容易。我们往往需要更好更精确的输出,这包括输出这个 log 的文件,调用的行号以及所处的方法名字等等。
我们当然可以在 print
的时候将当前的文件名字和那些必要的信息作为参数同我们的消息一起进行打印:
// Test.swiftfunc method() { //... print("文件名:Test.swift, 方法名:method,这是一条输出") //...}
但是这显然非常麻烦,每次输入文件名和方法名不说,随着代码的改变,这些 Log 的位置也可能发生改变,这时我们可能还需要不断地去维护这些输出,代价实在太大。
在 Swift 中,编译器为我们准备了几个很有用的编译符号,用来处理类似这样的需求,它们分别是:
因此,我们可以通过使用这些符号来写一个好一些的 Log 输出方法:
func printLog<T>(message: T, file: String = __FILE__, method: String = __FUNCTION__, line: Int = __LINE__){ print("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")}
这样,在进行 log 的时候我们只需要使用这个方法就能完成文件名,行号以及方法名的输出了。最棒的是,我们不再需要对这样的输出进行维护,无论在哪里它都能正确地输出各个参数:
// Test.swiftfunc method() { //... printLog("这是一条输出") //...}// 输出:// Test.swift[62], method(): 这是一条输出
另外,对于 log 输出更多地其实是用在程序开发和调试的过程中的,过多的输出有可能对运行的性能造成影响。在 Release 版本中关闭掉向控制台的输出也是软件开发中一种常见的做法。如果我们在开发中就注意使用了统一的 log 输出的话,这就变得非常简单了。使用条件编译的方法,我们可以添加条件,并设置合适的编译配置,使 printLog
的内容在 Release 时被去掉,从而成为一个空方法:
func printLog<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日志
- Marklogic学习 —— 日志Log处理
- swift学习日志——输入输出参数
- swift学习日志——可变参数
- swift学习日志—— 属性
- swift学习日志—— 属性观察
- python——log日志
- android日志工具—Log
- android学习笔记——灵活使用Log打印日志
- go语言学习------Go 记录日志——log包
- Rust日志学习(一)—— 初识Rust log
- swift学习日志—— 闭包(一)
- swift学习日志—— 闭包(二)
- swift学习日志—— 结构体和类
- swift学习日志—— lazy懒加载
- Android log日志类型 学习
- Symbian调试——使用Log日志
- Go 记录日志——log包
- 二、八、十六进制之间的转换
- Spring+Hibernate报错:Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL)
- ubuntu14.04添加右键终端
- iOS Autolayout -- 模块化、等宽高
- laravel环境搭建
- swift学习日志—— Log日志
- Nginx和Nginx+的比较(下)
- flex 显示二进制图片
- Java线程(篇外篇):阻塞队列BlockingQueue
- android中cardview的基本使用
- thinkphp 自定义分页类 跳页功能
- POJ 3565 Ants
- 关于x264的一篇论文:讲解很详细
- 使用JS加载GoogleMap