Swift之DEBUG & @autoclosure

MaeRowell 5年前
   <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>