调试的时候打断点太慢,所以输出log就是一个很好的选择了。断点,一行一行的按,太麻烦了。从log里一条一条的看,很快就可以找到到哪个函数的哪个地方这个代码就没执行了。这里不详细讨论调试技巧的事。不过大概就是这个样子。但是,输出的log你只想在调试的时候看。在正式发布的版本里,那些东西你给谁看,而且语句的执行还多少占资源。所以,这个时候就要用到#ifdef这样的处理命令,在DEBUG的时候输出log,发布版里不要这东西。

DLog:

#ifdef DEBUG
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define DLog(...)
#endif

这个宏定义可以看到,在执行的时候会输出函数的名称和行号以及其他的自定义的消息内容。所以,这个DLog输出的内容在调试的时候非常有效。

在Swift里也内置了很多的identifier,很容易就可以实现出上面的宏。当然,Swift里是没有宏定义的,所以就只能用最一般的函数了。Swift的实现:

func dlog(message: String) {
#if DEBUG
println("file: \(__FILE__), line:\(__LINE__)")
#endif
}

看着是很不错了。这里就想到小学课本里的那个一群鸟和某鸟学盖房子的故事了。

上面的函数是不可用的,因为,呵呵,输出的文件名和行号永远都是一样的。都是这个函数所在的文件的名字和这个函数定义在这个文件里的行的行号!你看到这个函数拿去就用是解决不了你的问题的。所以,往下看。

Swift有一个很有意思的特点,这个特点可以保证dlog这个函数输出调用函数的文件的名称和调用点的行号。来,看看代码你就懂了:

func dlog(message: String = "", file: String = __FILE__, function: String = __FUNCTION__, lineNum: Int = __LINE__) {
// #if DEBUG
println("FILE: \(file.pathComponents.last!),FUNC: \(function), LINE: \(lineNum) MESSAGE: \(message)")
// #else
// do nothing
// #endif
}

Swift这个特点就是给定默认值的函数参数。__FILE__, __FUNCTION__等都设定为函数的默认值。再调用的时候你可以直接忽略掉这些参数。这个时候,函数输出的就是调用点的文件名称和函数名称以及调用点所在的行号了。

最后,__FILE__的值是一个完成的文件的路径。在我们调试代码的时候这个是用不着的。因为,你的代码文件就在Xcode左侧的那框框里了,你不用去文件所在的位置去处理这个东西。我们只要文件名就可以了。所以用file.pathComponents.last来活的文件所在路径的文件的名字。

从Objective-C到Swift,你必须会的(四)DLog的更多相关文章

  1. 【Swift学习】Swift编程之旅(四)基本运算符

    Swift支持大部分标准C语言的运算符, 且改进许多特性来减少常规编码错误.如赋值符 = 不返回值, 以防止错把等号 == 写成赋值号 = 而导致Bug. 数值运算符( + , -, *, /, %等 ...

  2. Swift开发第五篇——四个知识点(Struct Mutable方法&Tuple&autoclosure&Optional Chain)

    本篇分三部分: 一.Struct Mutable方法 二.多元组(Tuple) 的使用 三.autoclosure 的使用 四.Optional Chain 的使用 一.Struct Mutable方 ...

  3. Swift实战-豆瓣电台(四)歌曲列表的展现

    观看地址 http://v.youku.com/v_show/id_XNzMwNDE0OTA4.html 这节的主要内容是如何利用cell展现获取到的数据. 首先申明两个数组来储存我们获取到的数据 v ...

  4. 初探swift语言的学习笔记四(类对象,函数)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  5. swift之函数式编程(四)

    文章内容来自<Functional Programing in Swift>,具体内容请到书中查阅 Map, Filter, Reduce Functions that take func ...

  6. 苹果新的编程语言 Swift 语言进阶(十四)--扩展

    扩展是为一个已经存在的类.结构.枚举类型添加新功能的一种方式,包括为不能存取源代码的那些已经存在的类型添加功能. 扩展类似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名 ...

  7. Swift学习笔记(十四)——字符,常量字符串与变量字符串

    在学习Java过程中,字符串碰到过String和StringBuffer,当中前者是不可变的,不能对字符串进行改动:后者是可变的,能够不断改动. 来到Swift中,对字符串的定义变的更加简单. (1) ...

  8. [Swift]八大排序算法(四):堆排序

    排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...

  9. iOS开发 Swift开发数独游戏(四) 游戏界面的界面与逻辑

    一.游戏界面涉及到的功能点 1)数独格子的建模 (1)绘制数独格子要考虑到标记功能 所以要在每个格子内预先塞入9个标记数字,仅数独格子算下来就有9*9*9=729个格子且存在大量嵌套(这导致我在操作S ...

  10. swift实现单例的四种方式

    单例模式 单例模式是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象. 当你只需要一个实例的时候需要使用单例 ...

随机推荐

  1. oracle之 安装 11G RAC 报 NTP failed

    问题描述: 使用 NTP 同步集群节点时间,安装 11G RAC 报 NTP 过不去. 解决过程:-- 查看 /etc/sysconfig/ntpd 文件配置root@hbdw1:/root$cat ...

  2. VS2015 Git 源代码管理工具使用记录

    1. 首先到源代码托管平台申请个账户:https://git.oschina.net/ 2.创建流程图: 2.1 开始创建项目: 2.2 3. 4.

  3. 在NOILINUX下的简易VIM配置

    位置:/etc/vim/vimrc 建议使用gedit来进行配置.即使用命令:sudo gedit /etc/vim/vimrc set mouse=a " Enable mouse usa ...

  4. nginx限制请求之三:Nginx+Lua+Redis 对请求进行限制

    相关文章: <高可用服务设计之二:Rate limiting 限流与降级> <nginx限制请求之一:(ngx_http_limit_conn_module)模块> <n ...

  5. expect学习笔记及用法

    expect学习笔记及实例详解 expect的基本用法 expect用法

  6. 像素(PX)转其它长度单位(mm、cm...)

    今天想把px转成mm为单位,因像素跟其它单位比值的大小会跟屏幕设置的分辨率大小而不定,因此不能以固定的数值去计算. 解决方法是 页面上放一个高度为1mm的隐藏块 <div id="di ...

  7. 读书笔记--大规模web服务开发技术

    总评        这本书是日本一个叫hatena的大型网站的CTO写的,通过hatena网站从小到大的演进来反应一个web系统从小到大过程中的各种系统和技术架构变迁,比较接地气.      书的内容 ...

  8. java后端时间处理工具类,返回 "XXX 前" 的字符串

    转自:https://www.cnblogs.com/devise/p/9974672.html 我们经常会遇到显示 "某个之间之前" 的需求(比如各种社交软件,在回复消息时,显示 ...

  9. delphi XE8 NetHTTPRequest NetHTTPClient

    delphi xe8 推出2个新http控件,NetHTTPRequest.NetHTTPClient 可以调用ASP.Net 一般应用程序获取网页数据,用旧的控件idhttp控件也可以,推荐用新的这 ...

  10. 可视化库-Matplotlib-散点图(第四天)

    1. 画基本的散点图 plt.scatterdata[:, 0], data[:, 1], marker='o', color='r', label='class1', alpha=0.4) np.r ...