Swift之DEBUG & @autoclosure

MaeRowell 8年前發布 | 8K 次閱讀 Swift Apple Swift開發

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

</pre>

那么在swift中怎么實現呢?

雖然swift中不能使用#define,但是卻可以使用#if來進行宏判定,那么我們就可以自定義一個 println 函數,如下

func println(item: () -> Any){

#if DEBUG
    Swift.print(item())
#endif

} </pre>

Build Configurations

關于宏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官方文檔。

<h2>@autoclosure</h2>

當然你可以看出,這里明顯我們要實現{}才能實現這種方式,而我們更傾向于使用(),因此 @autoclosure 登場了,我們重新定義該函數

func println(@autoclosure item: () -> Any) {

#if DEBUG
    Swift.print(item())
#endif

} </pre>

此時再次調用,如下:

println("debug")
<p>@autoclosure 做的事情就是把一句表達式自動地封裝成一個閉包 (closure)。這樣有時候在語法上看起來就會非常漂亮。</p>

當然需要注意 @autoclosure 只適用于這樣的 ()->T 無參閉包。

參考

Apple Swift

Using Swift with Cocoa and Objective-C (Swift 2.2)

 

來自: http://archerzz.com/swift/debug.html

 

 本文由用戶 MaeRowell 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!