Swift中@autoclosure

作者: 槛内浊物 | 来源:发表于2015-12-27 00:43 被阅读693次

我们先看一个例子

func or(first:Bool,second:()->Bool) -> Bool {
    if first {
        return true
    }
    else {
        return second()
    }
}

我这里定义了一个函数,函数有两个参数,第一个是一个Bool值,第二个参数是()->T这样一个无参数的闭包。我们用此函数对或运算进行模拟。

来看下调用

正常调用

or(2>3) { () -> Bool in
    return 4 > 3
}//等价于(2>3)|| (4>3),返回结果为true

正常情况下我们根据xcode提示,直接回车的话是这样调用的,但是这什么鸟玩意,长这么丑,我只不过是求个或运算,长这么丑,谁看的出来这是或运算。但是我们可以简化下

简化版

or(2>3, second: {4>3})

貌似好看了许多,但是看着还是这么别扭,尤其是我这种OC观念很深的人,这什么玩意,小括号套大括号的。还是很难看。

这时候我们可以用到我们的@autoclosure了

@autoclosure

在闭包前面加上@autoclosure

func or(first:Bool,@autoclosure second:()->Bool) -> Bool {
    if first {
        return true
    }
    else {
        return second()
    }
}

再来看下调用

or(2>3,second: 4>3)

这看起来既干净又方便理解,一看就知道2>3与4>3进行或运算。

@autoclosure:Apple为了让语法看起来更漂亮些,在Swift中为我们提供了这么一个神奇的东西@autoclosure,他可以让我们的表达式自动封装成一个闭包。

截图

看下在Playground的执行情况

or.gif

注意

@autoclosure只适用于这样的()->T无参闭包。

相关文章

  • 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及??

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

  • Swift 中的 @autoclosure

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

  • Swfit-@ autoclosure 详解

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

  • Swift @autoclosure

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

  • Swift @autoclosure

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

  • Swift @autoclosure

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

网友评论

  • Origheart:@autoclosure(自动闭包)
    1:自动闭包,顾名思义是一种自动创建的闭包,用于包装函数参数的表达式,可以说是一种简便语法.
    2:自动闭包不接受任何参数,被调用时会返回被包装在其中的表达式的值。
    3:自动闭包的好处之二是让你能够延迟求值,因为代码段不会被执行直到你调用这个闭包,这样你就可以控制代码什么时候执行。
    4:含有autoclosure特性的声明同时也具有noescape的特性,及默认是非逃逸闭包,除非传递可选参数escaping.如果传递了该参数,那么将可以在闭包之外进行操作闭包,形式为:请使用@autoclosure(escaping)。

    用autoclosure修饰第二个变量实现或运算符,其实是遵循了或运算的本质:只有左边为true时,才需要对右边进行运算

本文标题:Swift中@autoclosure

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