标签:
在讲swift的函数类型之前,我们先回忆一下我们以前学的定义一个swift的函数
func add(a: Int,b: Int) -> Int { return a + b }
好了, 我们开始我们函数类型的讲解
上面这个函数的类型是(Int ,Int)->Int
使用函数类型
我们都知道, 在swift中 , 函数类型就像其他数据类型一样,也就意味着我们可以给一个函数的常量或者是变量赋值
var f2: (Int,Int)-> Int = add f2(2,3) //结果为5
好了,接下来,我们来看一下函数类型比较的事例,首先,作为函数, 我们可以把作为参数传递给另一个函数
首先呢, 我们先定义一个接口
protocol ProcessInt { func guolv(data: Int)->Bool }
函数主体内容
func processArray2(chulizhe: ProcessInt) ->[Int] { //求数组内为偶数的值
let array = [1,8,7,3] var result:[Int] = [] for item in array{ if chulizhe.guolv(item) { result.append(item) } } return result }
要作为参数传入的函数
class OuShu: ProcessInt { func guolv(data: Int)->Bool{ return data % 2 == 0 } }
调用函数
processArray2(OuShu()) // 结果为8
好了, 函数类型就介绍到这里,就下来就是闭包的介绍了。。。
闭包:功能性自包含模块,可以在代码中被传递和使用,闭包是引用类型。
闭包可以”理解“通过下面的类实例化出来的一个对象
1.闭包是一个对象,是个引用类型
2.闭包是一个函数类型的对象
闭包表达式的语法
{(参数,参数) -> 返回类型 in}
下面的闭包表达式示例使用 sort 函数对一个 Int类型的数组进行升序(降序),以下是初始数组值:
let array = [20,1,2,8,3,9]
排序函数有两个参数:
func compare(a: Int,b: Int ) -> Bool { return a < b } array.sort(compare) //[1,2,3,8,9,20]
该例子对一个 Int类型的数组进行排序,因此排序闭包需为 (Int, Int) -> Bool 类型的函数。
闭包表达式,不需要额外定义函数
以下几种写法都可以达到排序的效果
1.通过调用array.sort()可以达到排序的效果
let resu = array.sort({(a:Int , b :Int) -> Bool in return a < b } ) resu //[1,2,3,8,9,20] let result2 = array.sort({(a: Int,b: Int)->Bool in return a > b }) result2 //[20,9,8,3,2,1]
2. 通过参数类型与返回类型的推断
let result3 = array.sort({(a,b) in return a > b }) result2 //[20, 9, 8, 3, 2, 1]
3.单行代码自动会返回此代码的结果
let result4 = array.sort({(a,b) in a > b }) result4 //[20, 9, 8, 3, 2, 1]
4自动提供简短的参数名 $0,$1,$2....
let resu4 = array.sort({$0>$1} ) //[20, 9, 8, 3, 2, 1]
5.如果一个函数(sort),它只有一个参数,此参数的类型是函数类型,那么可以把大括号中得内容放到小括号外面
let result5 = array.sort(){ $0 > $1 } result2 //[20, 9, 8, 3, 2, 1]
闭包可以在其定义的上下文中捕获常量或变量。 即使定义这些常量和变量的原作用域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值。
Swift最简单的闭包形式是嵌套函数,也就是定义在其他函数体内的函数。 嵌套函数可以捕获其外部函数所有的参数以及定义的常量和变量。
func funcFactory() ->() ->Int { var total = 0 func innerFunc() -> Int { total = total + 1 return total } return innerFunc } let r1 = funcFactory() r1() //1 r1() //2
每次调用这个函数时,total都会自加1,好了,闭包介绍到这里就结束了
标签:
原文地址:http://www.cnblogs.com/zhengyc/p/4975741.html