
闭包这个东西,一听就觉得逼格很高,本篇博客来讨论swift中的闭包。
闭包的定义是:巴拉巴拉,吼喽吼喽,OOXX。。。。。。,这就是闭包的定义。
其实,闭包就类似于其它语言中的lambda表达式,其本质就是一个匿名函数,作用有两个:
简化代码 装逼本篇以数组的sortInPlace方法为切入点,一步一步地介绍闭包是如何简化代码(并装逼)的。
注:数组的sort方法返回一个排序好的新数组,原来的数组不发生变化,而sortInPlace方法是直接修改原来的数组。
不使用闭包数组有一个sortInPlace()方法,可以将这个数组从小到大排列,例如:
var intArray=[8,2,4,3,6] intArray.sortInPlace()
此时数组为[2,6,8]@H_419_29@
如果我希望将该数组从大到小排列,sortInPlace()方法还提供了一个重载的版本,sortInPlace(isOrderedBefore: (Int,Int) -> Bool),该重载的方法接受一个类型为(Int,Int) -> Bool的函数作为参数,sortInPlace会对数组中的任意两个值都调用该函数,返回true的放到前面,从而将该数组排序。
为了将数组从大到小排列,我可以定义一个函数,然后作为一个参数传递给sortInPlace方法
func compare(num1 :Int,num2 :Int)->Bool{ return num1 >= num2}intArray.sortInPlace(compare)
此时数组为[8,6]@H_419_29@,功能已经实现了。这是不使用闭包的方式。可见,闭包不是必须的。接着往下看,看看闭包能不能吸引你来使用它。
我在上面已经提过了,闭包的本质就是匿名函数,接下来我们就使用闭包来调用sortInPlace方法
使用一般形式的闭包表达式闭包表达式的一般形式是这样的:
{(parameter s) -> returnType in statements} 那么,下面就来用一般形式创建一个闭包并传递给sortInPlace方法
intArray.sortInPlace({(num1:Int,num2 :Int) ->Bool in return num1 >= num2 }) 闭包的函数体部分由关键字 in引入。该关键字表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始。
由于该闭包的函数体比较短,所以可以将其写在一行
intArray.sortInPlace({(num1:Int,num2 :Int) ->Bool in return num1 >= num2 }) 简化参数类型和返回值类型 由于swift的类型推断机制,闭包可以省去参数的类型和返回值的类型,简化之后,代码如下:
intArray.sortInPlace({(num1,num2) in return num1 >= num2 }) 单行表达式闭包可以省略return 如果闭包内的函数体只包含一行代码,就可以省略return关键字。简化之后,代码如下:
intArray.sortInPlace({(num1,num2) in num1 >= num2 })参数名简写
Swift自动为内联函数提供了参数名称简写功能,我们可以直接通过 $0,$1,$2@H_419_29@ 等名字来引用闭包中的参数。简化之后,代码如下:
intArray.sortInPlace({ >= (lhs: Int,rhs: Int)}) 对于很多闭包来说,到这一步就已经是最精(zhuang)简(bi)的了,但对于本例中的闭包来说,还有更更精简的方式,就是直接使用swift提供的运算符函数。
运算符函数swift中定义了>=这个运算符
public func >= intArray.sortInPlace(> -> Bool 它的类型正好是我们的sortInPlace需要的类型,所以,我们可以将这个闭包简化为:
)=sortInPlaceTrailing 闭包
闭包还有一种形式,叫做Trailing闭包它的用途是:当一个很长的闭包作为一个函数的最后一个参数时,可以将该闭包写在参数所在的括号外面。如果我说的不是很明白,那么看代码
intArray.return(){ return >= }
花括号在小括号外面,明白了吧。这样使用的话,闭包必须是函数的最后一个参数。
关于Trailing闭包,还有一点需要说明一下,如果Trailing闭包是某函数的唯一参数的话,那么调用该函数时,小括号也可以省略。简化以后,代码如下:
intArray.sortInPlace { >= } 关于闭包的使用就介绍到这里,闭包的语法非常灵活,语法糖也很甜,具体如何使用,就由你们自由发挥了!
总结以上是内存溢出为你收集整理的swift 闭包全部内容,希望文章能够帮你解决swift 闭包所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)