闭包介绍
最近在学习swift的过程中,发现很多人都对于swift的闭包有很深的疑惑,今天就以我个人学习swift 1.2版本下的一些经验进行一些分享,如有错漏,望大家指出。 ps.《关于Swift学习之每日一tip》我这段时间会持续更新,而其中关于swift的内容都是在今年(2014)春节之后,苹果推出Xcode6.3测试版的之后推出的swift 1.2的语法,关于1.2与1.1的语法,我会在明天的内容中进行一下介绍。
通用闭包
首先,给大家写一段常见的闭包代码
demo{ (name) -> () in println("\(name): 完成了吗?") }
上面这个闭包实际上是闭包的一个回调,下面写出准备好的闭包的内容
func demo(finished:(name: String)->()) { println("小明正在玩命工作中... ") // 执行闭包,完成耗时操作后,做回调 let t = "大 BOSS" finished(name: t) }
执行结果:
小明正在玩命工作中... 大 BOSS: 完成了吗?
以上就是一个最常用的闭包,在这里,闭包实际上与Objective-c中的Block定义非常相似,都是先定义出后面准备好的闭包的内容,然后再在我们需要的地方进行闭包的调用,即可。
大家理解了闭包的原理之后,我们再来分析这段闭包代码。
// 闭包的格式 /** { (参数) -> (返回值) in 代码实现 } */
大家在初学闭包的时候,可以比照着这个格式来看闭包的调用,因为一般在调用的时候,闭包会更加的直观。
- 在上面这段代码中,在回调时,我们打印了一句话,传入了一个闭包内部定义好的名字。
- 而在闭包的准备内容中,我们可以看到,在这里,实际上可以看做是C++或者其他高级语言中的函数,而我们的闭包实际上是一个参数。
- 在这个函数内部,我们在需要的地方,进行闭包的调用。
- 然后,我们再在其他需要执行这个函数的地方进行回调代码,传入我们在回调时想要得到的效果。
- 整个过程实际上就是代理设计模式的设计思路,这在苹果的ios开发中,非常常见,具体可以参照Objective-c中的代理和Block
不知道通过上面的这些内容,大家对于闭包有没有一个初步的认识?
下面介绍一下闭包的一种常见简化写法:
尾随闭包
实际上,第一次看到尾随闭包的时候,我并没有意识到这是一个闭包,因为他太简单了,简单到什么程度?
demo2 { println("over" }
对,你没看错,就是这样。这就是一个尾随闭包的调用。
实际上,他的完整版应该是这样的:
demo2 { () -> () in println("over") }
看到这里,相信聪明的同学已经猜出来了,这个尾随闭包顾名思义,如果闭包是最后一个参数,可以进行简化,当这个闭包里连参数都没有的话,我们就可以像上面那样写出如此简单的闭包调用。
在这里我们定义一下这个闭包:
func demo2(completion:()->()) { // 执行耗时操作 println("耗时操作") // 回调 completion() }
这个闭包就是符合我上面所说的闭包是最后一个参数,同时闭包里连参数都没有。
当然尾随闭包只需要闭包是最后一个参数的情况下就可以进行简写,这里就不写了,因为本人并不推荐那样的写法,可读性太差了!!
最后,我再简单说一下闭包的返回值:
闭包的返回值
废话不多说,上代码:
// 闭包的返回值 demo3 { () -> Int in return 10 }
在这里,大家似乎应该都发现了,我在写代码的时候都喜欢先写调用,再写闭包的内容,这里当然是为了大家方便理解,抛开语法的束缚,不喜勿喷哟~^_^。
下面是闭包的定义:
func demo3(rowCount:()->Int) { // 通过闭包的返回值,获得数据信息 let count = rowCount() println("行数 \(count)") // ... }
这么简单的过程,相信小伙伴们应该都不需要我再多废话了吧,今天就到这里,明天再见。