最近在开发swift经常使用printf来打印,大家都知道打印是一件很耗性能的事情,在OC中有 NSLog(format, ...) 自定义Log(format, ##VA_ARGS) 的宏可以使用,在swift中该怎么办呢,网上也有第三方的log但是本着减少对第三方的依赖的想法我们来自定义Log
自定义Log
首先我们新建一个类写一个公共的泛型函数
public func ZMLogs<T>(debug: T, _ file: String = #file , _ function: String = #function, _ line: Int = #line) {
if(ZMLogsManger.enabled)
{
//let fileExtension = file.ns.lastPathComponent.ns.pathExtension
let filename = file.ns.lastPathComponent.ns.stringByDeletingPathExtension
print("\(filename):\(function):[\(line)]\(debug)")
}
}
我来解释一下:
-
#file 获取方法调用者所在的文件路径
-
#function 获取方法调用者所在的方法名
-
#line 获取所在的行数
在写一个结构体,里面就一个属性用来管理Log是否开启
public struct ZMLogsManager {
//是否开启调试
public static var enabled = true
}
注意:是否开启调试要放在AppDelegate里面设置
好接下来我们在ViewController里写
打印运行看控制台
控制台是不是很简单呢这是最基本的功能,以后会继续扩展功能,在这里下载代码
另一种方法:
不写ZMLogsManager,去自定义comstom flags
自定义 输入-D DEBUG输入-D DEBUG
现在就可以在代码加上
public func ZMLogs<T>(debug: T, _ file: String = #file , _ function: String = #function, _ line: Int = #line) {
#if DEBUG
let filename = file.ns.lastPathComponent.ns.stringByDeletingPathExtension
print("\(filename):\(function):[\(line)]\(debug)")
#endif
}
这种方式也是可以的是不是更高大上了呢
网友评论
所以只要设置下 comstom flags 就依然可以 #if DEBUG,可以参照下面
http://stackoverflow.com/questions/24003291/ifdef-replacement-in-swift-language#answer-36502874
当然我觉得这样方式更好 http://stackoverflow.com/questions/24003291/ifdef-replacement-in-swift-language#answer-34532569
通过使用内置函数可以自动的根据代码当前的 build cfg 是 Debug 或者 Release 来决定是否打印 log