转载

Swift之DEBUG & @autoclosure

DEBUG & @autoclosure

DEBUG

最近刚好在研究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 } 

Build Configurations

关于宏DEBUG的配置方式,进入工程的 TRAGETS ,然后进入 Build Settings ,然后输入 other ,在里面可以看到 DebugRelease 两个Flags,当然我们只需要在 Debug 中添加即可,输入格式: -D <#flag#> , 如图所示:

Swift之DEBUG &amp; @autoclosure

添加之后,如果所示:

Swift之DEBUG &amp; @autoclosure

调用

那么在调用过程中使用println有以下三种方式:

// 1. 不省略 println { () -> Any in     return "debug" } // 2. 省略return println({"debug"}) // 3. 尾随闭包 println{"debug"} 

关于闭包的省略方式,我在这里就不多讲,你可以参考swift官方文档。

@autoclosure

当然你可以看出,这里明显我们要实现{}才能实现这种方式,而我们更倾向于使用(),因此 @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)

原文  http://archerzz.com/swift/debug.html
正文到此结束
Loading...