## 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 搜索控件