标签:
突然看到别人写的关于Block的帖子,让我突然有一种想写一篇关于闭包的帖子。在我的认知中,Swift中的闭包,就是Object-C中的Block--(或许我的认知太浅了)。先上一个闭包的简单例子
let isInputEven = { (input:Int)->(Bool) in if input % 2 == 0 { return false } return true } print(isInputEven(3))
上述代码定义了一个闭包,名字是 isInputEven。接收一个Int类型的参数,返回Bool类型,参数和返回值,都是在大括号里边写的,in后边写执行的内容。有Block经历的同学们,看这段代码应该不费力吧。后边的调用,就很简单了。跟C语言的函数类似。
闭包与Block不同的一点,Block内部如果需要改变Block外边定义的变量,需要在变量声明前加__block 修饰,而闭包可以任意修改外部变量,如下代码
var i = 3 let isInputEven = { (input:Int)->(Bool) in i += 1 if input % 2 == 0 { return false } return true } print(isInputEven(3)) print(i)
输出的结果是true 4
Swift中,已经告别了Block,所有的系统代码都用闭包来实现。在使用的方式和Block无太大差异。下边给一个关于UIView动画的函数
UIView.animateWithDuration(0.5) { () -> Void in self.view.backgroundColor = UIColor.redColor() }
[UIView animateWithDuration:5.0f animations:^{view.opacity = 0.5f;}];
第一个是闭包,第二个是OC里的Block,是不是并无太大差异。如果参数和返回值并无任何使用,可以省略。上述代码可以写成
UIView.animateWithDuration(0.5) { self.view.backgroundColor = UIColor.redColor() }
需要一提的是,闭包里的变量,需要加上self.来告知这个View的归属。外加一句,控制器的View再OC中需要说明,self.view.而在Swfit中直接写view就是系统的view了。写到这里我就有多多少少的感触。从系统的角度,如果知道的事情,并不需要程序员来说明,大大提高了程序的友好度。
标签:
原文地址:http://www.cnblogs.com/wulongt/p/5059173.html