Log 输出是程序开发中很重要的组成部分,虽然它并不是直接的业务代码,但是却可以忠实地反映我们的程序是如何工作的,以及记录程序运行的过程中发生了什么。

在 Swift 中,最简单的输出方法就是使用 print,在我们关心的地方输出字符串和值。但是这并不够,试想一下当程序变得非常复杂的时候,我们可能会输出很多内容,而想在其中寻找到我们希望的输出其实并不容易。我们往往需要更好更精确的输出,这包括输出这个 log 的文件,调用的行号以及所处的方法名字等等。

我们当然可以在 print 的时候将当前的文件名字和那些必要的信息作为参数同我们的消息一起进行打印:

// Test.swift
func method() {//...print("文件名:Test.swift, 方法名:method,这是一条输出")//...
}

但是这显然非常麻烦,每次输入文件名和方法名不说,随着代码的改变,这些 Log 的位置也可能发生改变,这时我们可能还需要不断地去维护这些输出,代价实在太大。

在 Swift 中,编译器为我们准备了几个很有用的编译符号,用来处理类似这样的需求,它们分别是:

符号 类型 描述
#file String 包含这个符号的文件的路径
#line Int 符号出现处的行号
#column Int 符号出现处的列
#function String 包含这个符号的方法名字

因此,我们可以通过使用这些符号来写一个好一些的 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.swift
func 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 DEBUGprint("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")#endif
}

新版本的 LLVM 编译器在遇到这个空方法时,甚至会直接将这个方法整个去掉,完全不去调用它,从而实现零成本。

swift LOG 输出相关推荐

  1. android简化log输出方法

    android简化版log输出 希望实现的效果: 只需要将类实现ILog接口(不需要进行任何额外的操作),然后就能直接通过printLog进行日志的输出 如下: class A implements ...

  2. Android中获取WebView加载的html中console.log输出的内容

    场景 Android中使用WebView加载本地html并支持运行JS代码和支持缩放: Android中使用WebView加载本地html并支持运行JS代码和支持缩放_BADAO_LIUMANG_QI ...

  3. linux c打印日志文件,linux c下log输出代码模板示例代码

    前言 本文主要介绍了关于linux c下log输出代码模板的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 模板 模本分为两个文件:log.c和log.h. log.c /* ...

  4. 一个小巧的C++Log输出到文件类

    一个小巧的C++Log输出到文件类 (转) 作者:wangyin159 http://www.cnblogs.com/mazhenyu/p/4139352.html 一个小巧的C++Log输出到文件类 ...

  5. Vue项目如何过滤全部console.log输出(浅水魚)

    Vue项目如何过滤全部console.log输出 在App.vue的created中调用一个consoleCancle方法 然后在methods中创建一个consoleCancle方法,让consol ...

  6. 针对不同的package定义log输出

    2019独角兽企业重金招聘Python工程师标准>>> 针对不同的package定义log输出 转载于:https://my.oschina.net/u/138995/blog/19 ...

  7. AndroidT(13) Log 系统 -- C plus plus 语言格式的LOG输出(二)

    1.概览   上一章提到的是在Android系统中,以C语言格式方式进行log输出.本章就来讲讲c++语言格式的. std::cout<<"This is a c++ log&q ...

  8. android jni 中实现 LOG 输出调试

    android jni 中实现 LOG 输出调试 在jni 文件夹下 android.mk文件中 添加 LOCAL_LDLIBS += -L$(SYSTEM)/usr/lib -llog 在jni中添 ...

  9. 如何用console.log输出pornhub图标(误)

    起因 下午写了一下shell脚本, 突然想到chrome的devtool是不是也支持字体颜色, 本着上下求索和学以致用的精神,试了一下确实可以 尝试 这个方法是支持对打印的结果加一些简单的样式的, 如 ...

最新文章

  1. 开玩笑,我的代码会有问题 ?!
  2. Create C++ Windows Forms Application in Visual Studio 2017
  3. 卸载 linux http
  4. pycharm2017.2.1中的修改工程文见列表的名字的字体大小以及文件列表的背景颜色
  5. BZOJ-1922 大陆争霸 多限制、分层图最短路 (堆+dijkstra)
  6. 位域(Bit-fields)分析
  7. iOS底层探索之类的加载(二): realizeClassWithoutSwift分析
  8. SI9000阻抗计算安装教程
  9. 企业微信API群机器人配置
  10. Android ActivityManager类
  11. 软件评测师--第17小时 功能测试
  12. java安卓开发改变图片大小_Android代码中动态设置图片的大小(自动缩放),位置...
  13. raw格式镜像文件转vmdk
  14. 【浙大版《Python 程序设计》题目集(解)】第4章-9 查询水果价格(15分)
  15. 医生一句话,6岁女娃的视力从0.15回到1.0!
  16. ora-3136故障处理
  17. 【Theano】安装教程
  18. Linux主机定期打补丁修复漏洞
  19. 前端笔记(Html+CSS+JS+DOM+网页特效+jQuery+HTML5+CSS3+canvas 标签+web开发重难点+面向对象+AJAX)
  20. 弄了一整天,终于把打印自定义纸张大小搞定了(上)--IT man

热门文章

  1. 等我搞研究发财了,我就......
  2. 学习全基因组测序数据分析1:测序技术
  3. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的指数权重移动(滚动)平均、例如,计算某公司的多个店铺每N天(5天)的滚动销售额指数权重移动(滚动)平均
  4. R语言ggplot2可视化(facet图)使得第一个子图的坐标轴范围一致
  5. RStudio启动后修改文件(数据)读取默认目录
  6. R绘制QQ图并解读QQ图
  7. 随机森林图像分类实战:随机森林分类聚类(Kmeans)降维后的数据、随机森林分类聚类(Kmeans)降维后的合成(append)数据
  8. 智能睡眠评估系统(包含:睡眠数据特征工程、睡眠评分、睡眠聚类、睡眠可视化分析、睡眠结论存储)
  9. ajax dojo deferred,dojo(四):ajax请求
  10. Anconda PyCharm TensorFlow