【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
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
相关文章推荐
- 【swift】15-0529 In-Out参数 函数类型
- Swift开发教程--实现UITableView报错does not conform to protocol 'UITableViewDataSource‘
- 从0开始学习Swift开发IOS应用(5)——Button
- KeyStone安装部署笔记
- 从0开始学习Swift开发IOS应用(4)——Navigation Controller
- 对象存储系统Swift官方文档
- [Swift 学习笔记] 之 前言
- Swift开发教程--UITextField输入框如何隐藏软键盘
- 深入云存储系统Swift存储节点:存储实现分析
- Swift开发教程--Main.Storyboard拉入控件并实现事件
- [Swift 工作tips] 之 iOS 中判断当前设备的相机是否可用
- 深入云存储系统Swift核心组件:Ring实现原理剖析
- Swift系统学
- 【swift】15-0528 函数参数
- Swift学习笔记-字典Dictionary
- 【swift总结】swift语言总览
- ios_swift开发资源整理
- [翻译]Swift编程语言——目录(2015-02-09版本)
- [翻译]Swift编程语言——关于Swift
- swift教程-使用UIGestureRecognizer