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
</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 無參閉包。
參考
Using Swift with Cocoa and Objective-C (Swift 2.2)
來自: http://archerzz.com/swift/debug.html
本文由用戶 MaeRowell 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!