swift中@autoclosure及??

是什么

@autoclosure能把一句表达式自动封装成一个闭包

至于具体的定义书中说的都很详细,这里就不具体展开了。这里主要记录下个人对后面“??”这个例子的理解。

应用

func ??(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(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时才会调用,对于有值的情况下就不会调用,因此会节省相应的开销,而第二种显然不能达到这种效果。

你可能感兴趣的:(swift中@autoclosure及??)