专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Swift

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

发布时间:2011-06-30 07:26:20 文章来源:www.iduyao.cn 采编人员:星星草
Swift学习之每日一tip (5)@autoclosure

@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 的方法时还请特别小心,如果在容易产生歧义或者误解的时候,还是使用完整的闭包写法会比较好。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: