最近在学习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
代码实现
}
*/
大家在初学闭包的时候,可以比照着这个格式来看闭包的调用,因为一般在调用的时候,闭包会更加的直观。
不知道通过上面的这些内容,大家对于闭包有没有一个初步的认识?
下面介绍一下闭包的一种常见简化写法:
实际上,第一次看到尾随闭包的时候,我并没有意识到这是一个闭包,因为他太简单了,简单到什么程度?
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)")
// ...
}
这么简单的过程,相信小伙伴们应该都不需要我再多废话了吧,今天就到这里,明天再见。
原文地址:http://blog.csdn.net/u010982858/article/details/45608161