您的位置:首页 > 移动开发 > Swift

【swift】15-0530 闭包

2015-05-30 10:54 246 查看
闭包closures:一个代码块,可以捕获周围的常量和变量。函数也是一种特殊的闭包。

sorted函数

let 城市列表 = {

“Beijing”,

“New York”,

“Paris”,

“Shenzhen”,

“Shanghai”

}

func 字母靠后 (字符串1: String, 字符串2: String) -> Bool {

return 字符串1 > 字符串2

}

var 新城市列表 = sorted(城市列表, 字母靠后) //这里字母靠后这函数不用加括号

闭包表达式语法

用函数实现:

func 字母靠后 (字符串1: String, 字符串2: String) -> Bool {

return 字符串1 > 字符串2

}

var 新城市列表 = sorted(城市列表, 字母靠后)

用闭包实现:

var 新城市列表2 = sorted(城市列表, {(字符串1: String, 字符串2: String) -> Bool in return 字符串1 > 字符串2})

做法就是将函数名去掉,参数和返回值移到大括号内,用in连接原来的函数体。

闭包的类型推断

swift中有很强大的类型推断,所以闭包的类型可以省略。

上面也可以简写为:

var 新城市列表2 = sorted(城市列表, {(字符串1, 字符串2) -> Bool in return 字符串1 > 字符串2})

闭包单行间接返回

如果闭包的执行语句只有单行表达式,那么return也可以省略。

var 新城市列表2 = sorted(城市列表, {(字符串1, 字符串2) -> Bool in 字符串1 > 字符串2})

闭包参数简写

swift提供了以开头的0,1,2,...的参数,因此就不用闭包定义参数了,直接使用开头的0,1,2,...的参数,因此就不用闭包定义参数了,直接使用开头的0,1,2,…的参数对应我们使用的参数。

又可以简写为:

var 新城市列表2 = sorted(城市列表, {0>0 > 1})

操作符函数

一个操作符对应一个函数。

“>”本身就是一个函数,参数省略:

var 新城市列表2 = sorted(城市列表, {>})

再省略函数体所以简写为:

var 新城市列表2 = sorted(城市列表, >)

挂尾闭包

给函数传递一个闭包表达式,而且这个闭包表达式就是这个函数的最后一个参数,这时候可以把闭包整体移到函数后面。

比如:var 新城市列表2 = sorted(城市列表, {0>0 > 1})

可以写成:var 新城市列表2 = sorted(城市列表){0>0 > 1}

通常用于闭包表达式语句非常多的情况。

let 数字中文对应字典 = [

0: “零”

1: “一”

2: “二”

3: “三”

4: “四”

5: “五”

6: “六”

7: “七”

8: “八”

9: “九”

]

let 数字组 = [20, 300, 22, 56, 4563, 123]

数字组.map {

(var 数字) -> String in

var 输出字符串 = “”

//把一串数字变成字符串

while 数字 > 0 {

输出字符串 = 数字中文对应字典[数字 % 10]! + 输出字符串 //这里”数字中文对应字典[数字 % 10]“字典中的索引返回的是一个optional类型的值,对其进行了强制拆包”数字中文对应字典[数字 % 10]!“。

数字 /= 10

}

return 输出字符串

}

map函数中参数只有一个闭包,因此把函数后面的()也省略了。

值捕获

func 累加器(#增量: Int) -> () -> Int {

var 和 = 0

func 累加() -> Int {

和 += 增量

return 和

}

return 累加

}

let a = 累加器(增量: 8) //调用一个引用

a() //8

a() //16

a() //24

let b = 累加器(增量: 10)

b() //10

b() //20 和上面的a没有关联

let c = a //调用的是一个引用,而不是复制一个值。

c() //40
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: