美文网首页
Swift学习 - 初学 @autoclosure

Swift学习 - 初学 @autoclosure

作者: Tony17 | 来源:发表于2020-06-17 19:45 被阅读0次

前言

对于从OC转入Swift的我来说,自动闭包(@autoclosure)是一个新事物,从字面解释看,是可以把方法的参数(表达式)自动封装成闭包。但不是很清楚具体有什么用,今天来看一下。

初探

自动闭包是Swift引入的一个特性,可以把参数(表达式)自动封装成一个闭包,自动闭包本身是不接受参数的,在调用的时候会返回表达式的值。系统的很多方法都用到了自动闭包,例如运算符 ?? || && 等。但是我自己写的方法,就很少用到这个特性。

public func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T
public static func && (lhs: Bool, rhs: @autoclosure () throws -> Bool) rethrows -> Bool
public static func || (lhs: Bool, rhs: @autoclosure () throws -> Bool) rethrows -> Bool

自动闭包的作用其实是延迟求值,只有在调用闭包的时候,才会真正执行被闭包包含的表达式。这个机制对于常量参数来说并没有什么用处,但是对于那些会引发很高计算成本的参数就很有用了,减少了不必要的系统开销。

下面我们用一个示例来简单的体会一下。

func test(v: Int, value: @autoclosure () -> Int) -> Int {
    print("执行方法")
    if v > 5 {
        return v
    } else {
        return value()
    }
}
func defaultValue() -> Int {
    print("执行默认值方法")
    return 50
}
print(test(v: 10, value: defaultValue()))
/// 执行结果:
执行方法
10

上面的方法在执行过程中并没有调用到 defaultValue 方法,但是如果我们把自动闭包去掉。执行结果就会变成

执行默认值方法
执行方法
10

虽然用不到 defaultValue 方法返回的值,但是由于作为参数传入 test 方法,在传入的时候会执行一次。

从上面的示例可以看出,自动闭包很多时候可能并没有什么用处(只能增加不必要的性能损耗);但是当真正用到的时候,可能一次执行就可以把所有的损耗都弥补回来。

通过对自动闭包的了解,我觉得当我们对外部提供方法的时候,当我们不知道外界会以怎样的方式传入我们需要的参数。所以采取自动闭包这种损耗些许性能的处理方式可能才是比较恰当的选择,有种 塞翁失马,焉知非福 的感觉。

最后

以上就是本篇的全部内容,势必会有一些遗漏和错误,欢迎斧正~

相关文章

  • Swift学习 - 初学 @autoclosure

    前言 对于从OC转入Swift的我来说,自动闭包(@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这样一个无参...

网友评论

      本文标题:Swift学习 - 初学 @autoclosure

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