閉包是?包含的函數代碼塊,可以在代碼中被傳遞和使?。 Swift 中的閉包與 C 和Objective-C 中的代碼塊(blocks)以及其他?些編程語?中的 lambdas 函數?較相似。
閉包可以捕獲和存儲其所在上下?中任意常量和變量的引?。 這就是所謂的閉合并包裹著這些常量和變量,俗稱閉包。Swift 會為您管理在捕獲過程中涉及到的所有內存操作。
在函數 章節中介紹的全局和嵌套函數實際上也是特殊的閉包,閉包采取如下三種形式之?:
全局函數是?個有名字但不會捕獲任何值的閉包
嵌套函數是?個有名字并可以捕獲其封閉函數域內值的閉包
閉包表達式是?個利?輕量級語法所寫的可以捕獲其上下?中變量或常量值的匿名閉包
Swift 的閉包表達式擁有簡潔的?格,并?勵在常?場景中進?語法優化,主要優化如下:
利?上下?推斷參數和返回值類型
隱式返回單表達式閉包,即單表達式閉包可以省略 return? 關鍵字
參數名稱縮寫
尾隨(Trailing)閉包語法
1、閉包表達式
(1)先看一下自帶的sort函數
Swift 標準庫提供了名為 sort? 的函數,會根據您提供的?于排序的閉包函數將已知類型數組中的值進?排序。 ?旦排序完成, sort(_:)? ?法會返回?個與原數組??相同,包含同類型元素且元素已正確排序的新數組。原數組不會被 sort(_:)? ?法修改。
~~~
let strs = ["ashdif", "gsdfao", "dsdokfn", "csddf"]
func compare(str1 : String, str2 : String) -> Bool {
return str1 > str2
}
var newStrs = strs.sort(compare)
print(strs)
print(newStrs)
//["ashdif", "gsdfao", "dsdokfn", "csddf"]
//["gsdfao", "dsdokfn", "csddf", "ashdif"]
~~~
(2)閉包表達式語法
閉包表達式語法有如下?般形式:
~~~
{ (parameters) -> returnType in
statements
}
~~~
閉包表達式語法可以使?常量、變量和 inout? 類型作為參數,不提供默認值。 也可以在參數列表的最后使?可變參數。 元組也可以作為參數和返回值。
~~~
let strs = ["ashdif", "gsdfao", "dsdokfn", "csddf"]
func compare(str1 : String, str2 : String) -> Bool {
return str1 > str2
}
var newStrs = strs.sort(compare)
print(strs)
print(newStrs)
var newStrs1 = strs.sort({(str1 : String, str2 : String) -> Bool in
return str1 < str2
})
print(newStrs1)
//["ashdif", "gsdfao", "dsdokfn", "csddf"]
//["gsdfao", "dsdokfn", "csddf", "ashdif"]
//["ashdif", "csddf", "dsdokfn", "gsdfao"]
~~~
(3)根據上下文推斷類型
~~~
let strs = ["ashdif", "gsdfao", "dsdokfn", "csddf"]
func compare(str1 : String, str2 : String) -> Bool {
return str1 > str2
}
var newStrs = strs.sort(compare)
print(strs)
print(newStrs)
var newStrs1 = strs.sort({(str1 : String, str2 : String) -> Bool in
return str1 < str2
})
print(newStrs1)
var newStrs2 = strs.sort({str1, str2 in return str1 > str2})
print(newStrs2)
//["ashdif", "gsdfao", "dsdokfn", "csddf"]
//["gsdfao", "dsdokfn", "csddf", "ashdif"]
//["ashdif", "csddf", "dsdokfn", "gsdfao"]
//["gsdfao", "dsdokfn", "csddf", "ashdif"]
~~~
(4)單表達式閉包隱式返回
單?表達式閉包可以通過隱藏 return? 關鍵字來隱式返回單?表達式的結果
~~~
var newStrs2 = strs.sort({str1, str2 in str1 > str2})
~~~
(5)參數名稱縮寫
Swift ?動為內聯函數提供了參數名稱縮寫功能,您可以直接通過 $0? , $1? , $2? 來順序調?閉包的參數。
如果您在閉包表達式中使?參數名稱縮寫,您可以在閉包參數列表中省略對其的定義,并且對應參數名稱縮寫的類型會通過函數類型進?推斷。? in? 關鍵字也同樣可以被省略,因為此時閉包表達式完全由閉包函數體構成:
~~~
var newStrs2 = strs.sort({ $0 > $1})
~~~
(6)運算符函數
實際上還有?種更簡短的?式來撰寫上?例?中的閉包表達式。 Swift 的 String? 類型定義了關于?于號 ( >? ) 的字符串實現,其作為?個函數接受兩個 String? 類型的參數并返回 Bool? 類型的值。
~~~
var newStrs2 = strs.sort(>)
~~~
2、尾隨閉包
如果您需要將?個很?的閉包表達式作為最后?個參數傳遞給函數,可以使?尾隨閉包來增強函數的可讀性。 尾隨閉包是?個書寫在函數括號之后的閉包表達式,函數?持將其作為最后?個參數調?。
~~~
var newStrs3 = strs.sort() {$0 > $1}
~~~
~~~
let hanzi = [0 : "零", 1 : "壹", 2 : "貳", 3 : "叁", 4 : "肆", 5 : "伍", 6 : "陸", 7 : "柒", 8 : "捌", 9 : "玖"]
let numbers = [23342, 832, 976]
let numbersHZ = numbers.map() {
(var number) -> String in
var outHZ = ""
while number > 0 {
outHZ = hanzi[number % 10]! + outHZ
number /= 10
}
return outHZ
}
print(numbers)
print(numbersHZ)
//[23342, 832, 976]
//["貳叁叁肆貳", "捌叁貳", "玖柒陸"]
~~~
再來一個簡單的例子:
~~~
func trailingClosure(a : Int, b : Int, c : (Int, Int) -> Bool) -> Int{
if c(a, b) {
return a
}else {
return b
}
}
let result = trailingClosure(10, b: 13) {//我的理解,簡單來說就是寫在括號外面,看著好看
$0 > $1
}
print(result)
//13
~~~
3、捕獲值
閉包可以在其定義的上下?中捕獲常量或變量。 即使定義這些常量和變量的原域已經不存在,閉包仍然可以在閉包函數體內引?和修改這些值。
Swift最簡單的閉包形式是嵌套函數,也就是定義在其他函數的函數體內的函數。 嵌套函數可以捕獲其外部函數所有的參數以及定義的常量和變量。
~~~
//求一個數x的y次方
func makecalculate(x : Int, y : Int) -> () -> Int {
var ret = 1
func achieve() -> Int {
for var i = 0; i < y; i++ { //捕獲參數y
ret *= x //捕獲變量ret和參數y
}
return ret
}
return achieve
}
let achiveFunc = makecalculate(3, y: 4)
print(achiveFunc())
//81
~~~
achieve函數并沒有任何參數,但是在函數體內訪問了 ret 和 x , y 變量。這是因為其通過捕獲在包含它的函數體內已經存在的 ret 和 x , y 變量的引?(reference)?實現。捕捉了變量引?,保證了 ret 和 x, y 變量在調?完 makecalculate? 后不會消失,并且保證了在下?次執? achieve 函數時, ret 可以繼續增加。
4、閉包是引用類型
?論您將函數/閉包賦值給?個常量還是變量,您實際上都是將常量/變量的值設置為對應函數/閉包的引?
- 前言
- swift控制語句,for,while,repeat-while,if,switch
- swift之聲明常量和變量
- swift之數值類型雜談(數值)
- swift之 元組
- oc與swift混編,OC調用swift,swift調用OC
- swift之可選類型
- swift之數組(Array)、集合(Set)、字典(Dictionary)
- swift之switch續(元組,值綁定,where)
- swift之控制轉移語句,continue,break,fallthrough,return,帶標簽的語句
- swift之函數(functions)
- swift之閉包(closure)
- swift之枚舉
- swift之類和結構體
- swift之屬性
- swift之方法(Methods)