swift中@autoclosure及??

是什么

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本章将会介绍 闭包表达式尾随闭包值捕获闭包是引用类型逃逸闭包自动闭包枚举语法使用Switch语句匹配枚举值关联值原...
    寒桥阅读 1,576评论 0 3
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,573评论 25 708
  • 86.复合 Cases 共享相同代码块的多个switch 分支 分支可以合并, 写在分支后用逗号分开。如果任何模式...
    无沣阅读 1,444评论 1 5
  • 我是萌果,95后姑娘,自我成长探索者h 画走心的画,写走心的字 遇见不一样的自己
    萌果能量站阅读 838评论 12 26
  • 你知道如何爱自己吗? 以前听过这样一句话,每个人最爱的永远是自己。 听到这样的话,我们都点头同意,却从未深思,其中...
    秤心阅读 407评论 1 1