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 的方法时还请特别小心,如果在容易产生歧义或者误解的时候,还是使用完整的闭包写法会比较好。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |