重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
一、閉包的概念
計(jì)算機(jī)語(yǔ)言要支持閉包的前提條件有2個(gè):
1、支持函數(shù)類型,能夠?qū)⒑瘮?shù)作為參數(shù)或返回值傳遞;
2、支持函數(shù)嵌套
示例:
func caculate(opr : String)->(Int,Int)->Int {
var result:(Int,Int)->Int
switch(opr){
case "+":
result={(a:Int,b:Int)->Int in
return a+b
}
default:
result = {(a:Int,b:Int) -> Int in
return a - b
}
}
return result;
}
let f1:(Int,Int)->Int = caculate("+")
println(f1(2,5))
通過(guò)以上示例,我們可以給Swift的閉包一個(gè)定義:閉包是自包含的匿名函數(shù)塊,可以作為表達(dá)式,函數(shù)參數(shù)和函數(shù)返回值,閉包表達(dá)式的運(yùn)算結(jié)果是一種函數(shù)類型
Swift的閉包類似于C和Obeject-C的代碼庫(kù),C++和C#的Lamba表達(dá)式,JAVE中的內(nèi)部匿名類
二、閉包的表達(dá)式
Swift中的閉包表達(dá)式的標(biāo)準(zhǔn)寫法如下:
{(參數(shù)列表)->返回值類型 in 語(yǔ)句組}
1、類型推斷簡(jiǎn)化
Swift中可以根據(jù)上下文環(huán)境推斷出參數(shù)類型和參數(shù)返回值,以下代碼是標(biāo)準(zhǔn)形式的閉包:
{(a : Int, b : Int)-> Int in
return a + b
}
Swift能推斷出參數(shù)a和b為Int類型,返回值為Int類型,簡(jiǎn)化形式如下:
{a,b in return a + b}
2、隱藏return關(guān)鍵字
如果在閉包的內(nèi)部語(yǔ)句組只有一條語(yǔ)句,如 rerturn a + b,那么這種語(yǔ)句都是返回語(yǔ)句,前面的關(guān)鍵字rerturn可以省略,省略形式如下:
{a,b in a + b}
3、縮寫參數(shù)名稱
Swift提供了參數(shù)名稱縮寫的功能,我們可以用$0,$1,$2,表示調(diào)用閉包中的函數(shù),$0表示第一個(gè)參數(shù),$1表示第二個(gè)參數(shù),以此類推
func caculate(opr : String)->(Int,Int)->Int {
var result:(Int,Int)->Int
swtich opr{
case "+":
result={$1,$2}
default:
result={$1-$2}
}
return result
}
4、使用閉包返回值
閉包表達(dá)式本質(zhì)上是函數(shù)類型,是有返回值的,可以在表達(dá)式中直接使用閉包的返回值
let c1 :Int = {(a:Int,b:Int)->Int in return a+b}(10,5)
println(c1)
三、使用尾隨閉包
閉包表達(dá)式可以作為函數(shù)的參數(shù)傳遞,閉包必須是最后一個(gè)參數(shù)的時(shí)候才能使用
示例:
func caculate(opr : String,funcN:(Int,Int)->Int){ switch opr{ case "+": println(funcN(10,5)) default: println(funcN(10,5)) } } caculate("+"){(a:Int,b:Int)->Int in return a + b} caculate("-"){(a:Int,b:Int)->Int in return a - b}
四、捕獲上下文中的常量和變量
嵌套函數(shù)或閉包可以訪問(wèn)它所在上下文的變量和常量,這個(gè)過(guò)程稱之為捕獲值,即便是定義這些變量和常量的原始域已經(jīng)不存在,嵌套函數(shù)或閉包仍然可以在函數(shù)體內(nèi)或閉包體內(nèi)引用和修改這些值。
示例:
funMakeArray()->String-[String]{ var ary:[String] = [String]() funcAddElement(element:String)->[String]{ ary.append(element) return ary } return addElement } let f1 = funMakeArray() println(f1("張三")) println(f1(”李四“)))
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。