swift 闭包

闭包这个东西,一听就觉得逼格很高,本篇博客来讨论swift中的闭包。

闭包的定义是:巴拉巴拉,吼喽吼喽,OOXX。。。。。。,这就是闭包的定义。

其实,闭包就类似于其它语言中的lambda表达式,其本质就是一个匿名函数,作用有两个:

  1. 简化代码
  2. 装逼

本篇以数组的sortInPlace方法为切入点,一步一步地介绍闭包是如何简化代码(并装逼)的。

注:数组的sort方法返回一个排序好的新数组,原来的数组不发生变化,而sortInPlace方法是直接修改原来的数组。

不使用闭包

数组有一个sortInPlace()方法,可以将这个数组从小到大排列,例如:

var intArray=[8,2,4,3,6] intArray.sortInPlace()

此时数组为[2,6,8]
如果我希望将该数组从大到小排列,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]功能已经实现了。这是不使用闭包的方式。可见,闭包不是必须的。接着往下看,看看闭包能不能吸引你来使用它。

使用闭包表达式

我在上面已经提过了,闭包的本质就是匿名函数,接下来我们就使用闭包来调用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 等名字来引用闭包中的参数。简化之后,代码如下:

intArray.sortInPlace({$0 >= $1})

对于很多闭包来说,到这一步就已经是最精(zhuang)简(bi)的了,但对于本例中的闭包来说,还有更更精简的方式,就是直接使用swift提供的运算符函数

运算符函数

swift中定义了>=这个运算符

public func >= (lhs: Int,rhs: Int) -> Bool

它的类型正好是我们的sortInPlace需要的类型,所以,我们可以将这个闭包简化为:

intArray.sortInPlace(>=)

Trailing 闭包

闭包还有一种形式,叫做Trailing闭包它的用途是:当一个很长的闭包作为一个函数的最后一个参数时,可以将该闭包写在参数所在的括号外面。如果我说的不是很明白,那么看代码

intArray.sortInPlace(){
    return $0 >= $1
}

花括号在小括号外面,明白了吧。这样使用的话,闭包必须是函数的最后一个参数。
关于Trailing闭包,还有一点需要说明一下,如果Trailing闭包是某函数的唯一参数的话,那么调用函数时,小括号也可以省略。简化以后,代码如下:

intArray.sortInPlace {
    return $0 >= $1
}

关于闭包的使用就介绍到这里,闭包的语法非常灵活,语法糖也很甜,具体如何使用,就由你们自由发挥了!

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...