从Objective-C到Swift,你必须会的(四)DLog
调试的时候打断点太慢,所以输出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的更多相关文章
- 【Swift学习】Swift编程之旅(四)基本运算符
Swift支持大部分标准C语言的运算符, 且改进许多特性来减少常规编码错误.如赋值符 = 不返回值, 以防止错把等号 == 写成赋值号 = 而导致Bug. 数值运算符( + , -, *, /, %等 ...
- Swift开发第五篇——四个知识点(Struct Mutable方法&Tuple&autoclosure&Optional Chain)
本篇分三部分: 一.Struct Mutable方法 二.多元组(Tuple) 的使用 三.autoclosure 的使用 四.Optional Chain 的使用 一.Struct Mutable方 ...
- Swift实战-豆瓣电台(四)歌曲列表的展现
观看地址 http://v.youku.com/v_show/id_XNzMwNDE0OTA4.html 这节的主要内容是如何利用cell展现获取到的数据. 首先申明两个数组来储存我们获取到的数据 v ...
- 初探swift语言的学习笔记四(类对象,函数)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
- swift之函数式编程(四)
文章内容来自<Functional Programing in Swift>,具体内容请到书中查阅 Map, Filter, Reduce Functions that take func ...
- 苹果新的编程语言 Swift 语言进阶(十四)--扩展
扩展是为一个已经存在的类.结构.枚举类型添加新功能的一种方式,包括为不能存取源代码的那些已经存在的类型添加功能. 扩展类似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名 ...
- Swift学习笔记(十四)——字符,常量字符串与变量字符串
在学习Java过程中,字符串碰到过String和StringBuffer,当中前者是不可变的,不能对字符串进行改动:后者是可变的,能够不断改动. 来到Swift中,对字符串的定义变的更加简单. (1) ...
- [Swift]八大排序算法(四):堆排序
排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...
- iOS开发 Swift开发数独游戏(四) 游戏界面的界面与逻辑
一.游戏界面涉及到的功能点 1)数独格子的建模 (1)绘制数独格子要考虑到标记功能 所以要在每个格子内预先塞入9个标记数字,仅数独格子算下来就有9*9*9=729个格子且存在大量嵌套(这导致我在操作S ...
- swift实现单例的四种方式
单例模式 单例模式是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象. 当你只需要一个实例的时候需要使用单例 ...
随机推荐
- php 文件上传$_FILES中error返回值详解
用PHP上传文件时,我们会用程序去监听浏览器发送过来的文件信息,首先会通 过$_FILES[fieldName]['error']的不同数值来判断此欲上传的文件状态是否正常.$_FILES[field ...
- 给Linux内核增加一个系统调用的方法(转)
作者:chenjieb520 给Linux内核增加一个系统调用的方法 为了更加好地调试linux内核,笔者的实验均在mini6410的arm板上运行的.这样做的原因,第一是因为本人是学嵌入式的, ...
- 【转】Java transient关键字使用小记
哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transi ...
- 事务的ACID和四个隔离级别
在实际的业务场景中,并发读写引出了和事务控制的需求.优秀的事务处理能力是关系型数据库(特别是oracle等商用RDBMS)相对于正当风口的NoSQL数据库的一大亮点.但这也从另一方面说明了事务控制的复 ...
- python-web 创建一个输入链接生成的网站
第一步:写一个自定义程序 #coding=utf-8 import os #Python的标准库中的os模块包含普遍的操作系统功能import re #引入正则表达式对象import urllib # ...
- 使用libssh2连接到远程服务器
libssh2-1.7.0.tar.gz 示例代码:libssh2-1.7.0.tar.gz\libssh2-1.7.0\example 官网示例 https://www.libssh2.org/e ...
- python manage.py runserver 0.0.0.0:8000
python manage.py runserver 这种命令行,可以在服务器端输入IP:8000直接访问 在 python manage.py runserver 127.0.01:8000 在服务 ...
- Nginx 系统维护配置
转自:http://blog.csdn.net/kkgbn/article/details/52153383 tomcat关闭后 请求返回502状态码 error_page /.html; locat ...
- 8 MySQL--单表查询
单表查询: http://www.cnblogs.com/linhaifeng/articles/7267592.html 1.单表查询的语法 2.关键字的执行优先级(重点) 3.简单查询 4.whe ...
- XMLHttpRequest.status 返回服务器状态码
XMLHttpRequest.status: 1xx-信息提示 这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个1xx响应. 100-继续. 101-切换协议. 2xx-成功 ...