您好,登錄后才能下訂單哦!
閉包
什么是閉包?
是一個自包含的功能塊,可以在任何地方使用這個功能塊,且可以將其傳來傳去
閉包可以捕獲和存儲其所在上下文的任意常量和變量的引用
其意義相當于函數及block的綜合體
三種形式:
全局函數是一個有名字但不會捕捉任何值的閉包
嵌套函數是一個有名字并可以捕獲其封閉函數域內值的閉包
閉包表達式是一個利用輕量級語法所寫的可以捕獲上下文中變量或常量的沒有名字的閉包
閉包表達式
何時使用閉包表達式?
函數的參數類型為函數類型時,實參使用閉包
閉包表達式擁有簡潔的風格,并在常見場景中可以實現語法優化,如:
利用上下文推斷參數和返回值類型
單表達式閉包可以省略return關鍵字
參數名稱簡寫
尾閉包語法
實現一個排序功能,傳遞一個數組和一個比較方式的函數類型參數
利用函數實現的方式:
func sort(inout arr:[String], cmpFunc:(String,String)->Bool) {
let len = arr.count
for var i:Int = 0; i<len; i++ {
for var j:Int=0; j<len-i-1; j++ {
if ( cmpFunc(arr[j], arr[j+1]) ) {
let tmp:String = arr[j]
arr[j] = arr[j+1]
arr[j+1] = tmp
}
}
}
}
func cmp(s1:String, s2:String) -> Bool {
return s1 > s2
}
var names:[String] = ["Chris", "Alex", "Ewa", "Barry"]
sort(&names, cmpFunc: cmp)
這樣做的好處是:可以傳遞不同的cmp函數,實現自定義的排序依據
使用閉包表達式代替函數:
sort(&names, cmpFunc: {(s1:String, s2:String)->Bool in
return s1 > s2
})
函數類型的參數,使用閉包表達式使程序變得更加簡潔
完整的閉包表達式語法:
{ 函數類型 in 閉包代碼 }
根據上下文簡化,去掉閉包的函數類型:
sort(&names, cmpFunc: {s1, s2 in
return s1 > s2
})
Swift可以省略參數名,使用占位符代替參數名
sort(&names, cmpFunc: { return $0 > $1 })
單語句閉包比表達式,去掉return關鍵字
sort(&names, cmpFunc: { $1 > $2})
最后的簡化,依賴于運算符重載:
sort(&names, cmpFunc: >)
尾閉包
什么是尾閉包?
當閉包表達式作為函數的最后一個參數時的一種書寫方式,如:
sort(&names) { (s1, s2) -> Bool in
return s1 > s2
}
即將閉包表達式這個參數拿到參數列表后面去實現,這種方式比較易于代碼的編寫
捕獲值
閉包可以在其定義的上下文中捕獲常量或變量
即使定義這些常量和變量的原域已經不存在,閉包內仍可以引用和修改這些值。
如:
func myFuncTwo(xFunc:()->Void) {
xFunc()
}
func myFuncOne() {
var a:Int = 5
myFuncTwo { () -> Void in
a++
}
print(a)
}
myFuncOne() //6
再如內嵌函數也是一種閉包,且可以訪問內嵌所在的作用域內的變量或常量
func myFuncOne() {
var a:Int = 5
func myFuncTwo() {
a++
}
myFuncTwo()
print(a) //6
myFuncTwo()
print(a) //7
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。