Swift @autoclosure

先看苹果中断言的实现过程,感受下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 关键字 以此来达到和原有方法一致的调用方式 同时又提升了性能

你可能感兴趣的:(Swift @autoclosure)