从Objective-C到Swift,你必须会的(四)DLog

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

DLog:


1

2

3

4

5

#ifdef DEBUG

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

#else

#   define DLog(...)

#endif

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

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


1

2

3

4

5

func dlog(message: String) {       

    #if DEBUG

       println("file: \(__FILE__), line:\(__LINE__)")

    #endif

}

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

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

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


1

2

3

4

5

6

7

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来活的文件所在路径的文件的名字。

 

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/p/4037266.html

时间: 2024-11-08 00:39:18

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

Swift教程_CoreData实例(四)_构建控制层(查询、更新数据)

Swift教程_CoreData实例(一)_构建storyboard Swift教程_CoreData实例(二)_构建数据层 Swift教程_CoreData实例(三)_构建控制层(列表数据加载.删除数据) Swift教程_CoreData实例(四)_构建控制层(查询.更新数据) Swift教程_CoreData实例(五)_构建控制层(添加数据) 2.查询数据 我们自定义一个列表控制器PKOBookDetailTableViewController,并应用到storyboard的明细显示view

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

原文:Swift实战-豆瓣电台(四)歌曲列表的展现 观看地址 http://v.youku.com/v_show/id_XNzMwNDE0OTA4.html 这节的主要内容是如何利用cell展现获取到的数据. 首先申明两个数组来储存我们获取到的数据 var tableData:NSArray=NSArray() var channelData:NSArray=NSArray() tableData是主界面上歌曲列表要用的数据.所以在func tableView(tableView: UITabl

程序员眼中的苹果Swift语言:简单 易学 高效

[摘要]Swift正式曝光在镁光灯前,叹息声.惊呼声此起彼伏.不过不用太过担心,Objective-C.Swift能够在同一个应用程序中并存.程序员眼中的苹果Swift语言:简单 易学 高效6月8日消息,对于苹果开发者来说,如今已经进入了"Swift时代".虽然编程语言Objective C备受喜爱,不过它作为苹果主流编程语言的日子已经所剩无几.随着WWDC开发者大会的落幕,Swift即将取而代之,成为苹果新iOS 8.OS X Yosemite的新宠.美国时间6月2日举行的苹果WWD

即使是封闭的苹果,也不得不开源了 Swift

在2015苹果WWDC上,最受欢迎和关注的不是iOS 9和OS X,也不是新的Apple Music,而是苹果软件工程副总裁 Craig Federighi 宣布,苹果的编程语言 Swift 2.0 将会开源. 为 什么大家会如此激动?在过去的15年间,开发者已经显示了对开源工具和平台的偏爱,然而苹果一直让开发者适应自己的技术,远离第三方技术.苹果这样做有一 定风险,有可能会与开发人员关系疏远,也正是这些开发人员一直在开发第三方应用或者服务.程序员想自由选择自己想要的工作方式 ,要留住他们,苹果

苹果推出覆盖Swift程序设计语言内容的新博客Swift Blog

网易科技讯 7月11日消息,据国外媒体报道,苹果周五专为开发者推出覆盖Swift程序设计语言内容的新博客Swift Blog,Swift程序设计语言由苹果在今年WWDC大会上发布. 苹果在一份简要的文字介绍中表示,该博客将让开发者观察到开发工程师设计Swift语言的内幕,此外还有最新的新闻和提示,从而让开发者成为具有创造性的Swift程序员.由于内容不断更新,苹果向开发者和其他有兴趣方面提供了RSS订阅.该公司在该新平台提供Swift兼容性更新.Swift应用将兼容于该公司目前的操作系统,即OS

Swift程序设计语言由苹果在今年WWDC大会上发布

网易科技讯 7月11日消息,据国外媒体报道,苹果周五专为开发者推出覆盖Swift程序设计语言内容的新博客Swift Blog,Swift程序设计语言由苹果在今年WWDC大会上发布. 苹果在一份简要的文字介绍中表示,该博客将让开发者观察到开发工程师设计Swift语言的内幕,此外还有最新的新闻和提示,从而让开发者成为具有创造性的Swift程序员.由于内容不断更新,苹果向开发者和其他有兴趣方面提供了RSS订阅.该公司在该新平台提供Swift兼容性更新.Swift应用将兼容于该公司目前的操作系统,即OS

[置顶] Swift教程_CoreData实例(一)_构建storyboard

Swift教程_CoreData实例(一)_构建storyboard Swift教程_CoreData实例(二)_构建数据层 Swift教程_CoreData实例(三)_构建控制层(列表数据加载.删除数据) Swift教程_CoreData实例(四)_构建控制层(查询.更新数据) Swift教程_CoreData实例(五)_构建控制层(添加数据) 一.概述 文本用swift语言,使用coreData做一个实例,用来学习通过swift使用coreData的方法.以下是实现的效果,包含了增删改查功能

复选-swift tableview 刷新

问题描述 swift tableview 刷新 小弟在编写复选列表(用tableview 的每一个 cell 装每一个选项)时遇到刷新问题,点击刷新后,被选中的文件若上传成功,则在列表中不再显示,但是上传成功后刷新列表,原本存在的被选中的cell(用image标识)中的image下移到另一个cell中了.求大神帮我解决这个问题!!!! 或者求大神提供一个"复选列表"带自动刷新的可行方法!求大神帮忙小弟度过这个紧急时刻! 解决方案 好吧,最后我解决了这个问题,方案如下: 1.设置一个全局

Swift实战-豆瓣电台(五)播放音乐

原文:Swift实战-豆瓣电台(五)播放音乐 观看地址 http://v.youku.com/v_show/id_XNzMwODM0MzI0.html   在这节里面,我们简单学习了一下MediaPlayer的使用 引入媒体框架 import MediaPlayer   申明一个媒体播放器 var audioPlayer:MPMoviePlayerController=MPMoviePlayerController();   播放暂停操作 self.audioPlayer.stop() self

Swift教程_CoreData实例(二)_构建数据层

Swift教程_CoreData实例(一)_构建storyboard Swift教程_CoreData实例(二)_构建数据层 Swift教程_CoreData实例(三)_构建控制层(列表数据加载.删除数据) Swift教程_CoreData实例(四)_构建控制层(查询.更新数据) Swift教程_CoreData实例(五)_构建控制层(添加数据) 三.构建数据层 数据层总体结构包括由CoreData构建的数据模型.通过AppDelegate构建相应的初始化对象. coredata数据最终的存储类