今天我想跟大家聊一聊swift中的闭包。由于本人是从OC刚转过来不久,可能理解有些许偏差,有什么错误的地方大家可以给我发邮件。
首先跟大家说明一下,swift中的闭包类似于OC中的块,相信这个大家都应该能理解。至于官方文档中的说的lambds表达式,作为一个新手,我只能呵呵一下,这个建议大家看一下。好了,现在我们看一下闭包长什么样子:
{
(parameters) -> returenType in
statements
}
首先是我个人的观点,相对于OC这一点也是比较喜欢的。每当我敲击^这个符号的时候心里总是一阵莫名其妙的不爽,心里只剩下一句话,这是个啥,可能是我做开发的时间比较短,并且很快移情到swift,呵呵。Ok,OC的事今天咱们就不说了。今天咱们说说swift的这个closure。closure既然和OC的block类似,那么他的作用应该也是类似的,很显然他拥有block的特性,能使你的代码简洁,易读,紧凑。至于在GCD方面的应用这个我还跟大家不好说,应为我还没用swift做过这个方面的联系。以后的blog中我会给大家做相关的介绍,请大家继续关注。这个时候大家或许会问,这个时候block的功能很函数有什么区别吗?个人看法,一样一样的。
现在开始今天的代码演示:
var result: Int? //可选值,我以后会给大家谈谈这个
var Num:[Int] = [2,3]
func performOperation(operation: (Int,Int) ->Int){
result = operation(Num.removeLast(),Num.removeLast())
}
func multiply(op1: Int,op2: Int) ->Int{
return op1+op2
}
performOperation(multiply)
result!
这是一个很简单的程序。这个时候或许会有人高喊,博主,这么简单的程序你也好意思拿出来。好吧,如果你有这样呼喊,那就给大家补充一个吧,今天我所要给大家演示的就先用这一个函数了。
两个数求和,这是一个很简单的函数,在swift中你甚至不用写函数就能够直接求解出结果。今天为了演示的关系就先这么来吧。上面的方法我们是用函数求解的,好,现在我们用closures再写一个:
func performOperation(operation: (Int,Num.removeLast())
}
performOperation( {(op1: Int,op2: Int) ->Int in return op1+op2
} )
通过上面这个小例子,大家可以很清楚看出closure的优势了吧第二个程序看上去有没有清爽许多。在这里有个问题要提醒大家: 就像我前面说的那样,closure的作用和函数类似,所以很多情况下可以当作函数来使用,所以当一个函数的参数函数类型时,我门就可以考虑使用closure,不仅看上去高大上,而且节省代码量且代码看上去更加规整。另外,切忌不要盲目的使用closure,比如说,一个带有一个行参的函数,你试试能不能写成closure???Ok,接下来就是swift令人非议所思(只是我现在不是很明白)的一面。大家都知道,swift本身具有推断能力。看上面的例子当performOperation接受闭包做实参时,闭包里面的参数类型是可以推测得到的。于是我们可以简写代码为这个样子
{op1,op2 in return op1+op2},这个时候心里或许会有一句话,God,它时怎么办到的,这都行。当你现在还没转过神的时候,我又要告诉你个秘密:对于简单闭包,例如只有一行代码,像这个,我门可以忽略关键字return,这是什么鬼,你或许说,我告诉你,就是这行代码还可以这样:
{ op1,op2 in op1+op2 } 没有错,一切都是自动推断的功能,不管你有没有猜到,我都这样告诉你。到这里我们还可以写的更简单些,不过鉴于博主的能力,也只能到此为止了。明天我会跟新一些关于闭包取值和传值的内容。敬请期待啊!
原文链接:https://www.f2er.com/swift/327305.html