以往我們實現 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
函式。
覺得文章還不錯的話可以關注一下我的部落格