前言
对于从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
方法,在传入的时候会执行一次。
从上面的示例可以看出,自动闭包很多时候可能并没有什么用处(只能增加不必要的性能损耗);但是当真正用到的时候,可能一次执行就可以把所有的损耗都弥补回来。
通过对自动闭包的了解,我觉得当我们对外部提供方法的时候,当我们不知道外界会以怎样的方式传入我们需要的参数。所以采取自动闭包这种损耗些许性能的处理方式可能才是比较恰当的选择,有种 塞翁失马,焉知非福 的感觉。
最后
以上就是本篇的全部内容,势必会有一些遗漏和错误,欢迎斧正~
网友评论