码迷,mamicode.com
首页 > 编程语言 > 详细

浅谈swift中的函数类型和闭包

时间:2015-11-18 21:22:56      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:

在讲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]

排序函数有两个参数:

  • 已知类型值的数组。
  • 一个闭包,采用相同类型的数组的内容的两个参数,并返回一个布尔值来表示是否将第一个值在排序时放到第二个值的前面或是后面。如果第一个值应该出现第二个值之前,闭包需要返回true,否则返回false。  
  • 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,好了,闭包介绍到这里就结束了

 

浅谈swift中的函数类型和闭包

标签:

原文地址:http://www.cnblogs.com/zhengyc/p/4975741.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!