Swift学习之每日一tip (5)@autoclosure
来源:互联网 发布:js 人民币大写在线 编辑:程序博客网 时间:2024/05/17 05:54
@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 的方法时还请特别小心,如果在容易产生歧义或者误解的时候,还是使用完整的闭包写法会比较好。
0 0
- Swift学习之每日一tip (5)@autoclosure
- Swift学习之每日一tip (1)Selector
- Swift学习之每日一tip (2)词法结构
- Swift学习之每日一tip (3)闭包
- Swift学习之每日一tip (6) 单例
- Swift学习之每日一tip (7) @objc
- [swift学习之六]@autoClosure练习
- Swift学习之每日一tip (4)版本对比与一些小技巧
- Swift之自动闭包(@autoclosure、@noescape、@escape)
- 每日 swift 学习 (数组)
- 使用@autoclosure提高Swift代码质量
- [绍棠_Swift] Swift中的@noescape @escaping @autoclosure
- Swift中autoclosure和noescape关键字
- Python学习之路,每日一记
- python学习之每日一题
- 每日 swift 学习 (控制语句)
- iOS每日一记之———————————————转swift的学习感想
- 一 Swift学习之基础部分
- hdu 4734 数位DP
- [AC自动机+dp] whu oj 1572 I - Cyy and Fzz
- The progress of abstraction (抽象过程)
- poj 2342 树形DP
- POJ 3484 Showstopper (二分搜索)
- Swift学习之每日一tip (5)@autoclosure
- log4j使用方法收藏
- nonatomic, retain,weak,strong用法总结
- UVA 1025 DP
- leetcode:Course Schedule
- oc block链式编程
- Centos 5.5 LVS 负载均衡
- cf 500c 脑洞
- SQLQuery接口addScalar方法