巧妙地實現 debugOnly 函式

四娘發表於2018-09-24

以往我們實現 debug 函式,一般都是直接使用 compile flag (也就是編譯巨集)去實現的:

func debug(_ action: () -> Void) {
    #if DEBUG
    action()
    #endif
}
複製程式碼

但這種方式需要修改工程檔案的設定,而且離開了 Xcode 就不能很好地使用。

今天看 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 函式。

覺得文章還不錯的話可以關注一下我的部落格

相關文章