Swift @autoclosure

作者: 加州旅馆1116 | 来源:发表于2020-10-21 11:25 被阅读0次

    先看苹果中断言的实现过程,感受下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

        本文链接:https://www.haomeiwen.com/subject/dsusmktx.html