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与escaping标签

    @autoclosure 在《函数式 Swift》第四章提到了 Swift 的 autoclosure 标签能够避...

  • SwiftAPI设计之使用@autoclosure

    原文链接:Using @autoclosure when designing Swift APIs Swift的@...

  • Swift @autoclosure

    使用@autoclosure可以使得该参数结果延迟获取,在获取复杂数据结果作为参数时有优化的作用 使用@autoc...

  • Swift @autoclosure

    @autoclosure 做的事情就是把一句表达式自动地封装成一个闭包 (closure)。这样我们用的时候,就可...

  • Swift @autoclosure

    先看苹果中断言的实现过程,感受下autoclosure的魅力: 当x 不是单单的一个值 而是一个表达式返回的值呢?...

  • swift @autoclosure

  • Swift之||,&&,??的实现及原理

    前言 上篇Swift中@autoclosure模拟了或运算,这篇继续探讨或运算,看看Swift中或运算是如何实现的...

  • Swift @autoclosure 使用

    今天看了 Apple 博客的一篇文章 Building assert() in Swift, Part 1: ...

  • Swift中@autoclosure

    我们先看一个例子 我这里定义了一个函数,函数有两个参数,第一个是一个Bool值,第二个参数是()->T这样一个无参...

  • Swfit-@ autoclosure 详解

    @autoclosure 属于swift中的一个全新的创造, 随着swift语言的健壮,函数式编程的思想的渗透.闭...

网友评论

    本文标题:Swift @autoclosure

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