Swift中自定义Log打印方法
系统如何调用super方法
系统默认只会在构造函数中,自动调用super.init()方法,而且是在所写方法的尾部进行调用.
在其他函数中,如何需要调用父类的默认实现,都需要手动去实现.
如果在构造函数中使用KVC,一定要先调用父类的super.init()方法.
自定义Log的方法
以下语法为swift3的最新语法
- 获取打印所在的文件
- let file = (#file as NSString).lastPathComponent
- 获取打印所在的方法
- let funcName = #functon
- 获取打印所在的行
- let lineNum = #line
swift中有全局函数的概念:即将函数定义在项目中任意一个类文件的class外面,就可以在项目中的任何地方均可以调用这个方法.
自定义Log方法就是基于swift的全局函数来实现的.
另外,自定义log的时候,要考虑到在debug环境下进行打印,而在release环境下不需要进行打印.
由于swift中没有宏定义的概念,所以需要在项目的Build Settings->Other Swift Flags中为Debug添加一个标记,例如"-D DEBUG".
这样,在代码中,可以直接通过"DEBUG"这个关键词,来判断当前的运行环境是否为debug模式.
下面为自定义的Log方法:
func WJQLog<T>(_ messsage : T, file : String = __FILE__, funcName : String = __FUNCTION__, lineNum : Int = __LINE__) {
#if DEBUG
let fileName = (file as NSString).lastPathComponent
print("\(fileName):(\(lineNum))-\(messsage)")
#endif
}
// 调用代码如下:
WJQLog("test")
解释:
- 考虑到自定义Log要打印方法所在的文件/方法名/行号,以及自定义的内容,同时考虑调用的便捷性,所以要使用默认参数,无需调用者传递太多的参数.
- 使用泛型,可以让调用者传递任意的类型,进行打印Log的操作.
- #if DEBUG和#endif用来判断,只有在debug环境下,才执行Log里面的代码进行打印操作.在release环境下,不进行打印.