最近刚好在研究swift项目,那在项目中我们会经常进行调试,而调试的方式我们常用的经常是断点或者是Log,以下为在OC中常用的调试代码,在 release
的时候,我们只需要去掉相应的宏定义即可达到抹掉全部输出的效果。
#ifdef ZHDEBUG #define NSLog(FORMAT, ...) nil #else #define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d NSLog:%s/n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]) #endif
那么在swift中怎么实现呢?
虽然swift中不能使用#define,但是却可以使用#if来进行宏判定,那么我们就可以自定义一个 println
函数,如下
func println(item: () -> Any){ #if DEBUG Swift.print(item()) #endif }
关于宏DEBUG的配置方式,进入工程的 TRAGETS
,然后进入 Build Settings
,然后输入 other
,在里面可以看到 Debug
和 Release
两个Flags,当然我们只需要在 Debug
中添加即可,输入格式: -D <#flag#>
, 如图所示:
添加之后,如果所示:
那么在调用过程中使用println有以下三种方式:
// 1. 不省略 println { () -> Any in return "debug" } // 2. 省略return println({"debug"}) // 3. 尾随闭包 println{"debug"}
关于闭包的省略方式,我在这里就不多讲,你可以参考swift官方文档。
当然你可以看出,这里明显我们要实现{}才能实现这种方式,而我们更倾向于使用(),因此 @autoclosure
登场了,我们重新定义该函数
func println(@autoclosure item: () -> Any) { #if DEBUG Swift.print(item()) #endif }
此时再次调用,如下:
println("debug")
@autoclosure 做的事情就是把一句表达式自动地封装成一个闭包 (closure)。这样有时候在语法上看起来就会非常漂亮。
当然需要注意 @autoclosure
只适用于这样的 ()->T
无参闭包。
Apple Swift
Using Swift with Cocoa and Objective-C (Swift 2.2)