闭包介绍
通用闭包
首先,给大家写一段常见的闭包代码
- 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)")
- // ...
- }
这么简单的过程,相信小伙伴们应该都不需要我再多废话了吧,今天就到这里,明天再见。