以往我们实现 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 函数.
觉得文章还不错的话可以关注一下我的博客 https://kemchenj.GitHub.io/2018-09-24/
来源: https://juejin.im/post/5ba8f2b75188255c5c45f105