初探swift语言的学习笔记(闭包 - 匿名函数或block块代码)
很多高级语言都支持匿名函数操作,在OC中的block也为大家所熟悉,然面在swift里好像是被重新作了一个定义,不叫匿名函数,或 block了,而叫闭包(closure)。下面配合代码来理解一下swift的闭包强大之处。使用系统的一个sort排序方法来演示一下闭包的使用,引 用官网的事例
//闭包(即匿名函数或OC中的block块函)
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
//默认输出升序排序
println(sort(names)) func backwards(s1: String, s2: String) -> Bool {
return s1 > s2
}
//使用自定义函数进行排序
var reversed = sort(names, backwards)
println(reversed) //使用闭包({ (s1: String, s2: String) -> Bool in return s1 > s2 })函数进行排序
var desc = sort(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )
println(desc) //因为可以从names中推断出元素类型为String 因此闭包可以直接省去-> Bool
var des = sort(names, { s1, s2 in return s1 > s2 } )
println(des)
//此外,swift中还可以从闭包中S1>S2,只有单的一表达式,可推断了结果是BOOL值
//在这种没有歧义的情况下,可以省去return
des = sort(names, { s1, s2 in s1 > s2 } )
println(des) //还可以使用速记参数名
des = sort(names, { $0 < $1 } )
println(des) //还可以直接使用运算符来排序
des = sort(names,>)
println(des)
输出:
[Alex, Barry, Chris, Daniella, Ewa]
[Ewa, Daniella, Chris, Barry, Alex]
[Ewa, Daniella, Chris, Barry, Alex]
[Ewa, Daniella, Chris, Barry, Alex]
[Ewa, Daniella, Chris, Barry, Alex]
[Alex, Barry, Chris, Daniella, Ewa]
[Ewa, Daniella, Chris, Barry, Alex]
通过这些例子,可以看到swift的强大的编译及对代码的理解,只要代码足够清晰,没有歧义,就可以最大限度的省写一些代码,这样虽然减少了开 发者的编码,同时代码的灵活情写法也有了大幅的提升,一定的范围内,对初学者的适应能力加大了。要写出更省更优的代码质量,我想是必要把各种可能认知到一 个很高的深度。其实我很好期像
func backwards(s1: String, s2: String) -> Bool {
return s1 > s2
}
//使用自定义函数进行排序
var reversed = sort(names, backwards)
和
des = sort(names,>)
println(des)
这两个是实现同一功能,但代码的编写量却相差较大,这是其一,其二,我想信这两个在编译时,计算机对代码的理解时间上也不一样,对于第一种比较清楚,计算 机可能很快就认知,少了很多检查编译和验证,第二种,可能计算机要花少少时间来从names中推断各种可能后最终得到一个没有歧义的结果后才继续编译,其 三,这两个在运行其运行效率是一样的吗?其四,读者的阅读上带来了一定的难度。就像光看一个>号,可能一下还不知道这是干嘛用的。但如果第一种情况 就很好的知道是想干什么。
总而言之,swift的闭包有优也有略,大家在编码中就取其之长避其之短吧。当然什么是长,什么是短,读者自己定义了。
初探swift语言的学习笔记(闭包 - 匿名函数或block块代码)的更多相关文章
- 初探swift语言的学习笔记(闭包-匿名函数或block块代码)
使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 先说一下思想: 首先,创建两个视图控制器,在第一个视图控制器中创建一个UILabel和一个UIButto ...
- 初探swift语言的学习笔记三(闭包-匿名函数)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29353019 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
- 初探swift语言的学习笔记十(block)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/35783341 转载请注明出处 假设觉得文章对你有所帮助,请通过留言 ...
- 初探swift语言的学习笔记四(类对象,函数)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
- 初探swift语言的学习笔记七(swift 的关健词)
每一种语言都有相应的关键词,每个关键词都有他独特的作用,来看看swfit中的关键词: 关键词: 用来声明的: “ class, deinit, enum, extension, func, impor ...
- 初探swift语言的学习笔记五(线程)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/30354127 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
- 初探swift语言的学习笔记四-2(对上一节有些遗留进行处理)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/30314359 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
- 初探swift语言的学习笔记十一(performSelector)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/35842441 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
- 初探swift语言的学习—Object-C与Swift混编
swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编.这个在IOS8中是允许的. ...
随机推荐
- USB 3.1 Type-C
[時報記者任珮云台北報導]微軟.英特爾.蘋果今年將新款PC介面升級至USB 3.1規格,Wintel陣營今年新款PC產品亦將全面採用USB 3.1介面,里昂證出具最新的報告指出,在新趨勢帶動下,台廠的 ...
- POJ 3740 DLX
题意:给你一个01矩阵,然后求是否存在选择一些行,使得每一列的1的个数都为1. 思路:貌似朴素的DFS也可以,加点剪枝就可以过.这里贴个DLX的模版. 推荐博客:http://www.cppblog. ...
- java于23设计模式
详情请参阅23设计模式 版权声明:本文博主原创文章,博客,未经同意不得转载.
- 【小白的java成长系列】——java ide 开发工具eclipse的操作
今天看了一下自己的博客文章,里面的内容还是比較杂的,有好多技术,有好多语言,都没有突出自己的强项,能够说,从博客里面,看不出我究竟是做哪块的..加上今天被授予了博客准专家勋章,自己想了一下,还是得梳理 ...
- Android判断网络连接状态
有的时候我们的应用可能需要判断当前设备是否联网 private void init() { /** 获得系统级联网管理员对象 */ ConnectivityManager manager = (Con ...
- 使用VC++通过远程进程注入来实现HOOK指定进程的某个API
前阵子读到一篇关于<HOOK API入门之Hook自己程序的MessageBoxW>的博客,博客地址:http://blog.csdn.net/friendan/article/detai ...
- NOIP2012模拟试题【圆圈舞蹈( circle)
2.圆圈舞蹈( circle) [问题描述] 熊大妈的奶牛在时针的带领下,围成了一个圆圈跳舞.由于没有严格的教育,奶牛们之间的间隔不一致. 奶牛想知道两只最远的奶牛到底隔了多远.奶牛A到B的距离为A顺 ...
- poj1487
题目大意: 给一棵递归树,看链接图片,从根节点开始对于每个节点往它的子节点移动,直到叶子节点停止.每个节点选哪一个孩子节点继续往下走是随机的(等概率).然后叶子节点都会标记一个数值,记为走到该节点的得 ...
- Qt QtableView使用
ui->setupUi(this); ui->mainToolBar->hide(); tableView = new QTableView(this); // 设置表头 QStan ...
- Java并发编程实践(读书笔记) 任务执行(未完)
任务的定义 大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元. 任务的执行策略 1.顺序的执行任务 这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任 ...