是什么
@autoclosure能把一句表达式自动封装成一个闭包
至于具体的定义书中说的都很详细,这里就不具体展开了。这里主要记录下个人对后面“??”这个例子的理解。
应用
func ??<T>(optional: T?, defaultValue: @autoclosure () -> T) -> T {
switch optional {
case .Some(let value):
return value
case .None:
return defaultValue()
}
}
var level: Int?
var currentLevel = level ?? 1
这是??的具体实现
func unwrapped<T>(optional: T?, defaultValue: T) -> T {
switch optional {
case .some(let value):
print("\(value)")
return value
case .none:
print("defaultValue-----\(defaultValue)")
return defaultValue
}
}
var level: Int?
var startLevel = 1
var currentLevel = unwrapped(optional: level, defaultValue: startLevel)
这是去掉@autoclosure后的版本
这种情况下二者并不能看出有什么区别,但是当默认值需要进行复杂计算的时候,对于第一种是这样的
var currentLevel = level ?? (100 + 200 * 300)
由于后面的表达式会被自动封装成一个闭包,因此它只会在可选值level为nil时才会调用,对于有值的情况下就不会调用,因此会节省相应的开销,而第二种显然不能达到这种效果。