Swift之DEBUG & @autoclosure
MaeRowell
8年前
<h2>DEBUG & @autoclosure</h2> <h2>DEBUG</h2> <p>最近刚好在研究swift项目,那在项目中我们会经常进行调试,而调试的方式我们常用的经常是断点或者是Log,以下为在OC中常用的调试代码,在 release 的时候,我们只需要去掉相应的宏定义即可达到抹掉全部输出的效果。</p> <pre> #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 </pre> <p>那么在swift中怎么实现呢?</p> <p>虽然swift中不能使用#define,但是却可以使用#if来进行宏判定,那么我们就可以自定义一个 println 函数,如下</p> <pre> func println(item: () -> Any){ #if DEBUG Swift.print(item()) #endif } </pre> <h3>Build Configurations</h3> <p>关于宏DEBUG的配置方式,进入工程的 TRAGETS ,然后进入 Build Settings ,然后输入 other ,在里面可以看到 Debug 和 Release 两个Flags,当然我们只需要在 Debug 中添加即可,输入格式: -D <#flag#> , 如图所示:</p> <p><img src="https://simg.open-open.com/show/d4e3fe1c52783f65ac03b33e3e8bee6c.png"></p> <p>添加之后,如果所示:</p> <p><img src="https://simg.open-open.com/show/d7f1798748c043499174a2c2c8fcdb4b.png"></p> <h3>调用</h3> <p>那么在调用过程中使用println有以下三种方式:</p> <pre> // 1. 不省略 println { () -> Any in return "debug" } // 2. 省略return println({"debug"}) // 3. 尾随闭包 println{"debug"} </pre> <p>关于闭包的省略方式,我在这里就不多讲,你可以参考swift官方文档。</p> <h2>@autoclosure</h2> <p>当然你可以看出,这里明显我们要实现{}才能实现这种方式,而我们更倾向于使用(),因此 @autoclosure 登场了,我们重新定义该函数</p> <pre> func println(@autoclosure item: () -> Any) { #if DEBUG Swift.print(item()) #endif } </pre> <p>此时再次调用,如下:</p> <pre> println("debug") </pre> <p>@autoclosure 做的事情就是把一句表达式自动地封装成一个闭包 (closure)。这样有时候在语法上看起来就会非常漂亮。</p> <p>当然需要注意 @autoclosure 只适用于这样的 ()->T 无参闭包。</p> <h2>参考</h2> <p><a href="/misc/goto?guid=4959673681585261635" rel="nofollow,noindex">Apple Swift</a></p> <p><a href="/misc/goto?guid=4959673681666878475" rel="nofollow,noindex">Using Swift with Cocoa and Objective-C (Swift 2.2)</a></p> <p> </p> <p>来自: <a href="/misc/goto?guid=4959673681750739080" rel="nofollow">http://archerzz.com/swift/debug.html</a></p> <p> </p>