swfit关于闭包的理解与分析

品味人生 • 发布于 2019-02-01 21:37:02

这个家伙很害羞,不想介绍自己!

学习swift中遇到了swift中的闭包,实际上和javascript中的闭包比较像。

先说一下从官方文档中看到的实例,其中以三段不太好直观理解的形式贴一下

var numbers = [20,19,7,12]

numbers.map({

(number:Int) -> Int in

let result = 3 * number

return result

})

这一段的功能是将数组numbers全部 乘以 3以后返回

 

let mappedNumbers = numbers.map({number in 3 * number})

这有这种写法,与上面的方法功能一致,当然这种写法的前提是闭包的类型已知。这样的话就可以忽略参数的类型和返回值,swfit的单个语句闭包会把它的语句值当做结果返回

 

let sortedNumbers = sorted(numbers){$0 > $1}

这个方法的作用是对numbers数组中的各项变量进行前后比较。该方式是通过参数的位置来引用参数进行比较,这个方法一般是用在短闭包中作为最后一个参数传给一个函数的时候,就可以直接跟在括号的后面。

 

当然了,以上内容有点看得云里雾里的,在网上爬了一下文,找到了一些比较好理解的答案。


首先下面的前两个示例里面都用到了X函数,所以我们在这里先定义它

func X(x:Int) -> Int {

return x + 1

}


 

1.主要讲述函数对象本身可以作为另一个函数的参数或返回值

func Y(y:(Int)->Int) -> (Int)-> Int{

func Z(z:Int) -> Int{

return y(z)

}

return Z

}

Y(X)(10)

闭包运行的流程为:先将X函数 作为Y函数的参数传递到Y函数的函数体中。在Y函数的函数体中,由于获取参数时使用了变量y,因此这个时候可以理解为 y 现在具有X函数的功能。也可以理解为y 是X函数的一个实例。

随后y实例的返回值11在Z函数中被当做返回值返回给Z函数。 此时Y函数将Z函数作为返回值返回给Y(X)(10),因此这时就可以理解为Z函数的整个执行返回过程。 如上已经知道,实际上整个功能就是调用了X函数的功能,通过Y函数将参数传入到Y函数中进行运算,并且返回了结果11。所以Y函数的作用是将一个外部方法和一个变量参数进行组合运算并且返回出结果。

 

2.内嵌函数可以访问外层函数的局部变量

func Y(y:(Int)->Int) -> (Int)-> Int{

var x:Int = 10

func Z(z:Int) -> Int{

return y(z + x)

}

println(Z(x))

x = 20

return Z

}

Y(X)(10)

//这次的函数体实际上相当于是执行了两次X函数,区别在于第一次是在Y函数内部执行了一次Z函数,所以在函数体内部的print输出的结果为21。当第一次执行Z函数结束后,修改x的变量为20后,通过returnZ函数回调后,Z函数又被作为返回值又运行了一遍,因此此次的值变成了31。当然了,这个实例主要是讲述内嵌函数可以访问外层函数的局部变量,其实x=10时,只是在Y函数内部执行了一次Z函数,并非闭包作用。而通过return Z函数给Y函数 再通过Y函数将x = 20的变量传递给Z函数进行计算才是闭包的作用。

 

3.closure是一个匿名函数,并且也满足闭包条件,看上去和javascript中的匿名函数差不多

let funObj:(Int)->Int = {(a:Int) -> Int in

if a <= 0 {

return 0

}else{

return 1

}

}

let Obj = funObj(-1) + funObj(1)

//swift中匿名函数的写法,同时也满足闭包条件。 不过swift中不Closure不能使用递归。