swift——閉包

閉包的概念和定義

一段程序代碼通常由常量轻专、變量和表達(dá)式組成,之后使用一對花括號“{}”來表示閉合并包裹著這些代碼蝴罪,由這對花括號包裹著的代碼塊就是一個(gè)閉包纵势。

{
      (參數(shù)名1:參數(shù)類型,參數(shù)名2:參數(shù)類型...)->返回值類型  in
      閉包函數(shù)體
      return 返回值
}

不能在閉包參數(shù)中設(shè)置默認(rèn)值泽疆。

let sumFunc = {
        (x:Int,y:Int)->Int
        in
        return x+y
}

print(sumFunc(10,20))

如果一個(gè)閉包沒有參數(shù)和返回值户矢,那么基本格式中的參數(shù)列表、返回值殉疼、in都可以省略掉梯浪,這就是最簡單的閉包

let simpleFunc = {
    print("這是最簡單的閉包")
}

使用尾隨閉包

在Swift開發(fā)中,尾隨閉包是一個(gè)書寫在函數(shù)括號之后的閉包表達(dá)式瓢娜,函數(shù)支持其作為最后一個(gè)參數(shù)調(diào)用挂洛。

fun calculate(opr:String,funN:(Int,Int)->Int){
    switch(opr){
            case "+":
                print("10+5=\(funN(10,5))")
             default:
                print("10-5=\(funN(10,5))")
     }
}

調(diào)用calculate

calculate(opr:"+",funN:{(a:Int,b:Int)->Int in return a+b})
calculate(opr:"-",{(a:Int,b:Int)->Int in return a-b})

第一行代碼傳入funN參數(shù)比較長,為此眠砾,可以通過第2行代碼的調(diào)用方式虏劲,將小括號提前到閉包表達(dá)式前面,閉包表達(dá)式位于括號的外面褒颈,這種形式就是尾隨閉包柒巫。
注意:
要使用尾隨閉包,則閉包必須是參數(shù)列表的最后一個(gè)參數(shù)谷丸,如果不是最后一個(gè)的話吻育,是無法使用尾隨閉包寫法的。

使用閉包表達(dá)式

1.根據(jù)上下文推斷類型

{(a:Int,b:Int)->Int in
return a+b
}

Swift能夠推斷出參數(shù)a和b都是Int類型的淤井,返回值也是Int類型的布疼。

{a,b in return a+b}

eg:

fun calculate(opr:String)->(Int,Int)->Int{
     var result:(Int,Int)->Int
    switch(opr){
            case "+":
                result = {a,b in return a+b}
             default:
                result = {a,b in return a-b}
     }
     return result
}

let f1:(Int,Int)->Int = calculate(opr:"+")
print("10+5 = \(f1(10,5))")
let f2:(Int,Int)->Int = calculate(opr:"-")
print("10-5 = \(f2(10,5))")

2.單行閉包表達(dá)式可以省略return關(guān)鍵字
代碼形式如下:

{a,b in a+b}

eg:

fun calculate(our:String)->(Int,Int)->Int{
     var result:(Int,Int)->Int
    switch(opr){
            case "+":
                result = {a,b in a+b}
             default:
                result = {a,b in a-b}
     }
}

let f1:(Int,Int)->Int = calculate(opr:"+")
print("10+5 = \(f1(10,5))")
let f2:(Int,Int)->Int = calculate(opr:"-")
print("10-5 = \(f2(10,5))")

3.參數(shù)名稱縮寫
Swift提供了參數(shù)名稱 縮寫功能。用0币狠、1游两、2來表示調(diào)用閉包中參數(shù),0指代第1個(gè)參數(shù)漩绵,1指代第2個(gè)參數(shù)贱案,以此類推,n指代第n+1個(gè)參數(shù)止吐。

fun calculate(our:String)->(Int,Int)->Int{
     var result:(Int,Int)->Int
    switch(opr){
            case "+":
                result = {$0+$1}
             default:
                result = {$0-$1}
     }
}

let f1:(Int,Int)->Int = calculate(opr:"+")
print("10+5 = \(f1(10,5))")
let f2:(Int,Int)->Int = calculate(opr:"-")
print("10-5 = \(f2(10,5))")

4.使用閉包返回值
可以直接在表達(dá)式中使用閉包的返回值

let c1:Int = {(a:Int,b:Int)->Int in
                        return a+b}(10,5)
print("10+5=\(c1)")

捕獲

嵌套函數(shù)或者閉包可以在其定義的上下文中捕獲常量或者變量宝踪,即使定義的這些常量或變量的原作用域已經(jīng)不存在,仍然可以在閉包函數(shù)體內(nèi)引用和修改這些常量或變量碍扔,這種機(jī)制被稱為捕獲瘩燥。

fun makeArray()->(String)->[String]{
      var array:[String] = [String]()
       fun addElement(element:String)->[String]{
              array.append(element)
              return array
        }
        return addElement
}

let f1 = makeArray()
print("---f1---")
print(f1("張三"))
print(f1("李四"))
print(f1("王五"))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市不同,隨后出現(xiàn)的幾起案子厉膀,更是在濱河造成了極大的恐慌溶耘,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件服鹅,死亡現(xiàn)場離奇詭異凳兵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)企软,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門庐扫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仗哨,你說我怎么就攤上這事形庭。” “怎么了藻治?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巷挥。 經(jīng)常有香客問我桩卵,道長,這世上最難降的妖魔是什么倍宾? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任雏节,我火速辦了婚禮,結(jié)果婚禮上高职,老公的妹妹穿的比我還像新娘钩乍。我一直安慰自己,他們只是感情好怔锌,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布寥粹。 她就那樣靜靜地躺著,像睡著了一般埃元。 火紅的嫁衣襯著肌膚如雪涝涤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天岛杀,我揣著相機(jī)與錄音阔拳,去河邊找鬼。 笑死类嗤,一個(gè)胖子當(dāng)著我的面吹牛糊肠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播遗锣,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼货裹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了精偿?” 一聲冷哼從身側(cè)響起泪酱,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后墓阀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毡惜,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年斯撮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了经伙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勿锅,死狀恐怖帕膜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情溢十,我是刑警寧澤垮刹,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站张弛,受9級特大地震影響荒典,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吞鸭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一寺董、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刻剥,春花似錦遮咖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至漓藕,卻和暖如春魄藕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撵术。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工背率, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嫩与。 一個(gè)月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓寝姿,卻偏偏與公主長得像留特,于是被迫代替她去往敵國和親禽炬。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 閉包是自包含的函數(shù)代碼塊雷恃,可以在代碼中被傳遞和使用处坪。Swift 中的閉包與 C 和 Objective-C 中的代...
    窮人家的孩紙閱讀 1,715評論 1 5
  • 閉包可以從定義它們的上下文中捕獲和存儲對任何常量和變量的引用根资。 這被稱為關(guān)閉這些常量和變量架专。 Swift處理所有的...
    Joker_King閱讀 594評論 0 2
  • Swift 中的閉包是自包含的函數(shù)代碼塊,可以在代碼中被傳遞和使用玄帕。類似于OC中的Block以及其他函數(shù)的匿名函數(shù)...
    喬克_叔叔閱讀 523評論 1 3
  • 閉包是自包含的代碼塊部脚,可以在代碼中被傳遞和使用。Swift中的閉包與C和Objective-C中代碼塊(block...
    Raaaaamsey閱讀 849評論 0 2
  • * 閉包 是自包含的函數(shù)代碼塊裤纹,可以在代碼中被傳遞和使用委刘。swift中的閉包和Objective-C中的代碼塊(b...
    EndEvent閱讀 859評論 4 8