閉包
成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、沅陵網(wǎng)絡(luò)推廣、微信平臺小程序開發(fā)、沅陵網(wǎng)絡(luò)營銷、沅陵企業(yè)策劃、沅陵品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供沅陵建站搭建服務(wù),24小時服務(wù)熱線:18980820575,官方網(wǎng)址:muchs.cn
什么是閉包?
是一個自包含的功能塊,可以在任何地方使用這個功能塊,且可以將其傳來傳去
閉包可以捕獲和存儲其所在上下文的任意常量和變量的引用
其意義相當(dāng)于函數(shù)及block的綜合體
三種形式:
全局函數(shù)是一個有名字但不會捕捉任何值的閉包
嵌套函數(shù)是一個有名字并可以捕獲其封閉函數(shù)域內(nèi)值的閉包
閉包表達(dá)式是一個利用輕量級語法所寫的可以捕獲上下文中變量或常量的沒有名字的閉包
閉包表達(dá)式
何時使用閉包表達(dá)式?
函數(shù)的參數(shù)類型為函數(shù)類型時,實(shí)參使用閉包
閉包表達(dá)式擁有簡潔的風(fēng)格,并在常見場景中可以實(shí)現(xiàn)語法優(yōu)化,如:
利用上下文推斷參數(shù)和返回值類型
單表達(dá)式閉包可以省略return關(guān)鍵字
參數(shù)名稱簡寫
尾閉包語法
實(shí)現(xiàn)一個排序功能,傳遞一個數(shù)組和一個比較方式的函數(shù)類型參數(shù)
利用函數(shù)實(shí)現(xiàn)的方式:
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函數(shù),實(shí)現(xiàn)自定義的排序依據(jù)
使用閉包表達(dá)式代替函數(shù):
sort(&names, cmpFunc: {(s1:String, s2:String)->Bool in
return s1 > s2
})
函數(shù)類型的參數(shù),使用閉包表達(dá)式使程序變得更加簡潔
完整的閉包表達(dá)式語法:
{ 函數(shù)類型 in 閉包代碼 }
根據(jù)上下文簡化,去掉閉包的函數(shù)類型:
sort(&names, cmpFunc: {s1, s2 in
return s1 > s2
})
Swift可以省略參數(shù)名,使用占位符代替參數(shù)名
sort(&names, cmpFunc: { return $0 > $1 })
單語句閉包比表達(dá)式,去掉return關(guān)鍵字
sort(&names, cmpFunc: { $1 > $2})
最后的簡化,依賴于運(yùn)算符重載:
sort(&names, cmpFunc: >)
尾閉包
什么是尾閉包?
當(dāng)閉包表達(dá)式作為函數(shù)的最后一個參數(shù)時的一種書寫方式,如:
sort(&names) { (s1, s2) -> Bool in
return s1 > s2
}
即將閉包表達(dá)式這個參數(shù)拿到參數(shù)列表后面去實(shí)現(xiàn),這種方式比較易于代碼的編寫
捕獲值
閉包可以在其定義的上下文中捕獲常量或變量
即使定義這些常量和變量的原域已經(jīng)不存在,閉包內(nèi)仍可以引用和修改這些值。
如:
func myFuncTwo(xFunc:()->Void) {
xFunc()
}
func myFuncOne() {
var a:Int = 5
myFuncTwo { () -> Void in
a++
}
print(a)
}
myFuncOne() //6
再如內(nèi)嵌函數(shù)也是一種閉包,且可以訪問內(nèi)嵌所在的作用域內(nèi)的變量或常量
func myFuncOne() {
var a:Int = 5
func myFuncTwo() {
a++
}
myFuncTwo()
print(a) //6
myFuncTwo()
print(a) //7
}
分享文章:Swift2.0(10)閉包
文章分享:http://muchs.cn/article28/iegejp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、服務(wù)器托管、Google、微信小程序、企業(yè)網(wǎng)站制作、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)