100 Days of Swift - Day 07 - 閉包(下)

100 Days of Swift - Day 07 - 閉包Closures part 2

6.6 有參閉包作為函數(shù)參數(shù)

    1. 定義有參函數(shù)娃圆,函數(shù)參數(shù)為有參閉包
func travel(action: (String) -> Void) {
    print("I'm getting ready to go.")
    // 4. 函數(shù)體調(diào)用閉包
    action("London")
    print("I arrived!")
}
    1. 定義有參閉包
let parameterBlock = { (place: String) in
    // 5. 執(zhí)行閉包扒磁,使用閉包傳入的參數(shù)
    print("I'm going to \(place) in my car")
}
    1. 調(diào)用函數(shù),傳入 有參閉包 作為 函數(shù)參數(shù)
travel(action: parameterBlock)
  • Log:
 I'm getting ready to go.
 I'm going to London in my car
 I arrived!

6.7 有返回值閉包作為函數(shù)參數(shù)

    1. 定義有參函數(shù)傻工,函數(shù)參數(shù)為有返回值閉包
func travel(action: (String) -> String) {
    print("I'm getting ready to go.")
    // 4. 調(diào)用閉包使用參數(shù),并接收閉包返回值
    let description = action("London")
    print(description)
    print("I arrived!")
}
    1. 定義有返回值閉包
let returnValueBlock = { (place: String) -> String in
    // 5. 執(zhí)行閉包,使用閉包傳入的參數(shù),并返回一個數(shù)據(jù)
    return "I'm going to \(place) in my car"
}
    1. 調(diào)用函數(shù),傳入有參閉包作為函數(shù)參數(shù)
travel(action: returnValueBlock)

6.8 簡化閉包

    1. 定義有參函數(shù)盖腿,函數(shù)參數(shù)為有返回值閉包
func travel(action: (String) -> String) {
    print("I'm getting ready to go.")
    // 3. 調(diào)用閉包使用參數(shù)爽待,并接收閉包返回值
    let description = action("London")
    print(description)
    print("I arrived!")
}
    1. 調(diào)用函數(shù)损同,傳入有返回值閉包作為參數(shù)
travel { (place: String) -> String in
    return "I'm going to \(place) in my car"
}
  • short hand 省略閉包參數(shù)類型
travel { place -> String in
    return "I'm going to \(place) in my car"
}
  • short hand 省略閉包參數(shù)類型、省略返回值類型
travel { place in
    return "I'm going to \(place) in my car"
}
  • short hand 省略閉包參數(shù)類型鸟款、省略返回值類型膏燃、省略返回值關鍵字
travel { place in
    "I'm going to \(place) in my car"
}
  • short hand 省略閉包參數(shù)類型、省略返回值類型何什、省略返回值關鍵字组哩、省略閉包參數(shù) 使用$0 代替參數(shù)
travel {
    "I'm going to \($0) in my car"
}
  • Log
 I'm getting ready to go.
 I'm going to London in my car
 I arrived!
 I'm getting ready to go.
 I'm going to London in my car
 I arrived!
 I'm getting ready to go.
 I'm going to London in my car
 I arrived!
 I'm getting ready to go.
 I'm going to London in my car
 I arrived!
 I'm getting ready to go.
 I'm going to London in my car
 I arrived!
  • 簡寫閉包目的在于讓代碼可讀性增強,如果一個閉包有超過三個以上的參數(shù)处渣,還是建議不要簡寫伶贰,因為簡寫之后反而讓代碼不易閱讀。

6.9 多參數(shù)閉包

    1. 定義有參函數(shù)罐栈,函數(shù)參數(shù)為有多個參數(shù)有返回值閉包
func travel(action: (String, Int) -> String) {
    print("I'm getting ready to go.")
    let description = action("London", 60)
    print(description)
    print("I arrived!")
}
  • 調(diào)用函數(shù)黍衙,簡寫多參有返回值閉包
travel {
    "I'm going to \($0) at \($1) miles per hour."
}
  • 閉包參數(shù)和函數(shù)參數(shù)類似,可以有多個但不是越多越好荠诬,建議不要超過三個琅翻,但不絕對。因為一般參數(shù)過多的函數(shù)就需要考慮重構柑贞。

6.10 閉包作為函數(shù)返回值

  • 閉包可以作為函數(shù)參數(shù)方椎,也可以作為函數(shù)返回值。
    1. 定義有參函數(shù)钧嘶,函數(shù)返回值為有參有閉包
func travel() -> (String) -> Void {
    return {
        print("I'm going to \($0)")
    }
}
    1. 調(diào)用函數(shù),接收函數(shù)返回值
let result = travel()
    1. 閉包傳參
result("London")
  • 或者Step 2 & 3
travel()("London")

6.11 閉包捕獲外部變量

  • 閉包捕獲外部變量
func travel() -> (String) -> Void {
    var counter = 1
    
    return {
        print("\(counter). I'm going to \($0)")
        counter += 1
    }
}
  • 多次調(diào)用閉包棠众,外部變量被修改
let result = travel()
result("London")
result("London")
result("London")
  • Log
 1. I'm going to London
 2. I'm going to London
 3. I'm going to London
  • 閉包捕獲外部變量實際是為了保證閉包安全執(zhí)行,延長了外部變量的聲明周期保證閉包調(diào)用時外部變量生命周期與閉包統(tǒng)在康辑。

6.12 小結

  • 閉包可以作為變量摄欲,函數(shù)參數(shù),函數(shù)返回值使用
  • 閉包和函數(shù)類似疮薇,可以設置參數(shù)胸墙,在閉包體內(nèi)使用,也可以返回數(shù)據(jù)
  • 如果閉包作為函數(shù)最后一個參數(shù)稱之為尾隨閉包可以簡寫
  • Swift允許閉包可以簡寫參數(shù)及返回值
  • 閉包捕獲外部變量將延長其生命周期直至閉包銷毀

聲明:本文創(chuàng)作來自hackingwithswift

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末按咒,一起剝皮案震驚了整個濱河市迟隅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌励七,老刑警劉巖智袭,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件细卧,死亡現(xiàn)場離奇詭異磕仅,居然都是意外死亡君编,警方通過查閱死者的電腦和手機带族,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門屈扎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抠璃,你說我怎么就攤上這事塔沃。” “怎么了单起?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵抱怔,是天一觀的道長。 經(jīng)常有香客問我嘀倒,道長屈留,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任测蘑,我火速辦了婚禮灌危,結果婚禮上,老公的妹妹穿的比我還像新娘帮寻。我一直安慰自己乍狐,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布固逗。 她就那樣靜靜地躺著浅蚪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪烫罩。 梳的紋絲不亂的頭發(fā)上惜傲,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音贝攒,去河邊找鬼盗誊。 笑死,一個胖子當著我的面吹牛隘弊,可吹牛的內(nèi)容都是我干的哈踱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼梨熙,長吁一口氣:“原來是場噩夢啊……” “哼开镣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咽扇,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤邪财,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后质欲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體树埠,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年嘶伟,在試婚紗的時候發(fā)現(xiàn)自己被綠了怎憋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡九昧,死狀恐怖绊袋,靈堂內(nèi)的尸體忽然破棺而出赠橙,到底是詐尸還是另有隱情,我是刑警寧澤愤炸,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站掉奄,受9級特大地震影響规个,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姓建,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一诞仓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧速兔,春花似錦墅拭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至镀钓,卻和暖如春穗熬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丁溅。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工唤蔗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窟赏。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓妓柜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涯穷。 傳聞我的和親對象是個殘疾皇子棍掐,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

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