美文网首页
swift中@autoclosure及??

swift中@autoclosure及??

作者: 周二可 | 来源:发表于2017-06-13 11:39 被阅读18次

是什么

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

相关文章

  • swift中@autoclosure及??

    是什么 @autoclosure能把一句表达式自动封装成一个闭包 至于具体的定义书中说的都很详细,这里就不具体展开...

  • Swift的autoclosure与escaping标签

    @autoclosure 在《函数式 Swift》第四章提到了 Swift 的 autoclosure 标签能够避...

  • Swift中@autoclosure

    我们先看一个例子 我这里定义了一个函数,函数有两个参数,第一个是一个Bool值,第二个参数是()->T这样一个无参...

  • SwiftAPI设计之使用@autoclosure

    原文链接:Using @autoclosure when designing Swift APIs Swift的@...

  • Swift之||,&&,??的实现及原理

    前言 上篇Swift中@autoclosure模拟了或运算,这篇继续探讨或运算,看看Swift中或运算是如何实现的...

  • Swift 中的 @autoclosure

    由于种种原因,简书等第三方平台博客不再保证能够同步更新,欢迎移步 GitHub:https://github.co...

  • Swfit-@ autoclosure 详解

    @autoclosure 属于swift中的一个全新的创造, 随着swift语言的健壮,函数式编程的思想的渗透.闭...

  • Swift @autoclosure

    使用@autoclosure可以使得该参数结果延迟获取,在获取复杂数据结果作为参数时有优化的作用 使用@autoc...

  • Swift @autoclosure

    @autoclosure 做的事情就是把一句表达式自动地封装成一个闭包 (closure)。这样我们用的时候,就可...

  • Swift @autoclosure

    先看苹果中断言的实现过程,感受下autoclosure的魅力: 当x 不是单单的一个值 而是一个表达式返回的值呢?...

网友评论

      本文标题:swift中@autoclosure及??

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