加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift学习之每日一tip (5)@autoclosure

发布时间:2020-12-14 02:12:33 所属栏目:百科 来源:网络整理
导读:@autoclosure 可以说是 Apple 的一个非常神奇的创造 简单说,@autoclosure 做的事情就是把一句表达式自动地封装成一个闭包 (closure)。这样有时候在语法上看起来就会非常漂亮。 比如我们有一个方法接受一个闭包,当闭包执行的结果为 true 的时候进行打印: f

@autoclosure 可以说是 Apple 的一个非常神奇的创造

简单说,@autoclosure 做的事情就是把一句表达式自动地封装成一个闭包 (closure)。这样有时候在语法上看起来就会非常漂亮。

比如我们有一个方法接受一个闭包,当闭包执行的结果为 true 的时候进行打印:

func logIfTrue(predicate: () -> Bool) {
    if predicate() {
        println("True")
    }
}

在调用的时候,我们需要写这样的代码

logIfTrue({return 2 > 1})

当然,在 Swift 中对闭包的用法可以进行一些简化,在这种情况下我们可以省略掉 return,写成:

logIfTrue({2 > 1})

还可以更近一步,因为这个闭包是最后一个参数,所以可以使用尾随闭包 (trailing closure) 的方式把大括号拿出来,然后省略括号,变成:

logIfTrue{2 > 1}

但是不管那种方式,要么是书写起来十分麻烦,要么是表达上不太清晰,看起来都让人生气。于是 @autoclosure 登场了。我们可以改换方法参数,在参数名前面加上 @autoclosure 关键字:

func logIfTrue(@autoclosure predicate: () -> Bool) {
    if predicate() {
        println("True")
    }
}

这时候我们就可以直接写:

logIfTrue(2 > 1)

来进行调用了,Swift 将会吧 2 > 1 这个表达式自动转换为 () -> Bool。这样我们就得到了一个写法简单,表意清楚的式子。

最后要提一句的是,@autoclosure 并不支持带有输入参数的写法,也就是说只有形如 () -> T 的参数才能使用这个特性进行简化。另外因为调用者往往很容易忽视 @autoclosure 这个特性,所以在写接受 @autoclosure 的方法时还请特别小心,如果在容易产生歧义或者误解的时候,还是使用完整的闭包写法会比较好。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读