巧妙地實現 debugOnly 函式
以往我們實現debug
函式,一般都是直接使用 compile flag (也就是編譯巨集)去實現的:
func debug(_ action: () -> Void) { #if DEBUG action() #endif } 複製程式碼
但這種方式需要修改工程檔案的設定,而且離開了 Xcode 就不能很好地使用。
今天看ofollow,noindex">Vapor 的原始碼 時看到了一個很巧妙的實現:
func debugOnly(_ body: () -> Void) { assert({ body(); return true }()) } 複製程式碼
這是assert
函式的宣告:
func assert( _ condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = #file, line: UInt = #line ) 複製程式碼
condition
由於@autoclosure
的標記會把傳入的值自動裝到閉包裡,然後只有在 debug 模式下才會執行並且求值,通過這種方式就可以很完美地實現一個debugOnly
函式。
覺得文章還不錯的話可以關注一下我的部落格