先看苹果中断言的实现过程,感受下autoclosure的魅力:
func assert(x : Bool) {
#if !NDEBUG
/// 在 x 为true 并且 在!NDEBUG条件下使用 x的值
/*noop*/
#endif
}
当x 不是单单的一个值 而是一个表达式返回的值呢?
此时调用会是这样:
/*其实这里 不管#if !NDEBUG 满不满足 也会通过评估表达式来降低性能*/
assert(someExpensiveComputation() != 42)
这里可以使用 闭包达到延迟加载的效果
func assert(predicate : () -> Bool) {
#if !NDEBUG
if !predicate() {
abort()
}
#endif
}
此时的函数调用写法就变成了这样:
assert({ someExpensiveComputation() != 42 })
swift中的闭包调用写法就就是这样 但是 对于本例来说 asser(true or false) 的写法才应该是我们想要的
此时 @autoclosure 就派上用场了
func assert(predicate : @autoclosure () -> Bool) {
#if !NDEBUG
if !predicate() {
abort()
}
#endif
}
这时候的调用着这样的 (保留了原有的写法 又增加了延时函数调用功能)
assert(someExpensiveComputation() != 42)
类似的问题 我们可以使用Swift @autoclosure关键字来解决此问题。@autoclosure关键字可用于函数的参数,以表示应将未经修饰的表达式隐式包装在函数的闭包中
思考:
从本例来看 有些函数表达式可以通过改造接收一个 闭包的形式实现延迟加载,同时配合 @autoclosure 关键字 以此来达到和原有方法一致的调用方式 同时又提升了性能
网友评论