## Swift 闭包
**Swift 中闭包是引用类型** 有些时候定义一个函数可能只需要使用一次,
闭包本质上是函数
### 闭包写法
一般写法如下:
```
var arr:[Int] = []
for i in 0 ..< 100{
arr.append( Int(arc4random()%1000) )
}
arr.sort(by: {(a:Int,b:Int) -> Bool in
return a > b
})
```
> 在闭包的定义中,因为不会被外部调用,所以给闭包取外部的参数名没有意义。
闭包的简化写法:
```
arr.sort(by: {(a:Int , b:Int)-> Bool in return a > b}) // 如果闭包的函数体只有一行的情况,我们可以将其写在一行里。
arr.sort(by: {a , b in return a > b}) // Swift type inference.
arr.sort(by: {a , b in a > b})
arr.sort(by: { $0 > $1 })
arr.sort(by: >) // ">" 符号本身就是函数.
```
### 结尾闭包
Trailing Closure
如果需要传递的闭包在函数参数的末尾,我们可以使用结尾闭包的方式书写,如下:
```
arr.sort(by: ){ a , b in
return a > b
}
// 如果将闭包放到()外部,而原函数调用没有任何参数需要传递,那么这里我们可以将小括号去掉。
arr.sort{ a , b in
return a > b
}
```
使用结尾闭包的一个例子。
```
var arr:[Int] = []
for i in 0 ..< 100{
arr.append( Int(arc4random()%1000) )
}
var r = arr.map(){(number)-> String in
var number = number
var res = ""
repeat {
res = String(number%2) + res
number /= 2
}while number != 0
return res
}
```
### 内容捕获
一下是demo,随机取100个数字,以100为中心,将离100最近的数字越靠前
```
var arr:[Int] = []
for _ in 0 ..< 100{
arr.append( Int(arc4random()%1000) )
}
arr
var num = 100
arr.sort{ a , b in
return abs(a - num ) < abs(b - num)
}
```
> 在闭包内能自动捕获外部变量,但是会有内存泄漏的问题。
### 闭包和函数都有引用类型
```
// 计算跑步的里程数,单位m
func runningMetersWithMetersPerDay(metersPerDay: Int) -> () -> Int {
var totalMeters = 0 // 跑步的总数
return {
totalMeters += metersPerDay // 两个变量都是通过闭包外部的内容捕获获得值的。
return totalMeters
} // 返回闭包
}
var planA = runningMetersWithMetersPerDay(metersPerDay: 5000)
planA() // 5000
planA() // 10000
var planB = runningMetersWithMetersPerDay(metersPerDay: 1000)
planB() // 1000
planB() // 2000
var anotherPlan = planA // 将闭包赋值给另一个变量
anotherPlan() // 15000 在调用的过程中它们的值会累加,说明是引用类型
planA() // 20000 在调用的过程中它们的值会累加,说明是引用类型
let planC = runningMetersWithMetersPerDay(metersPerDay: 2000) // 对于引用类型,不代表里面的值不能被修改
planC() // 2000
planC() // 4000
//planC = runningMetersWithMetersPerDay(metersPerDay: 3000) // 这句赋值会报错
```
- 学习笔记
- 基础
- 基本类型之整型
- 基本类型之浮点型
- 基本类型之布尔类型以及简单的 if 语句
- 基础类型之元组
- 基本类型之其他
- 运算符
- 基础运算符
- 比较运算符、逻辑运算符
- 三元运算符
- 范围运算符for-in
- 逻辑控制
- 循环结构
- 选择结构
- 字符串
- Character和Unicode
- String.index 和 range
- 可选型
- 容器类
- 数组初始化
- 数组基本操作
- 字典初始化
- 字典基本操作
- 集合初始化
- 集合基本操作
- 函数
- 闭包
- 枚举
- 结构体
- 类
- 文档注释
- 属性和方法
- 下标和运算符重载
- 拓展和泛型
- 协议
- 其他
- Swift 3.0 For 循环
- Swift 随机数的生成
- IOS开发玩转界面 UIKit
- UILable 文本显示控件
- UIButton 简单的交互控件
- UIImageView 图片控件
- UISearchBar 搜索控件