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ù),并返回一個(gè)數(shù)據(jù)
    return "I'm going to \(place) in my car"
}
    1. 調(diào)用函數(shù),傳入有參閉包作為函數(shù)參數(shù)
travel(action: returnValueBlock)

6.8 簡(jiǎn)化閉包

    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ù)類型、省略返回值類型、省略返回值關(guān)鍵字
travel { place in
    "I'm going to \(place) in my car"
}
  • short hand 省略閉包參數(shù)類型、省略返回值類型、省略返回值關(guān)鍵字、省略閉包參數(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!
  • 簡(jiǎn)寫閉包目的在于讓代碼可讀性增強(qiáng),如果一個(gè)閉包有超過三個(gè)以上的參數(shù),還是建議不要簡(jiǎn)寫,因?yàn)楹?jiǎn)寫之后反而讓代碼不易閱讀。

6.9 多參數(shù)閉包

    1. 定義有參函數(shù),函數(shù)參數(shù)為有多個(gè)參數(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ù),簡(jiǎn)寫多參有返回值閉包
travel {
    "I'm going to \($0) at \($1) miles per hour."
}
  • 閉包參數(shù)和函數(shù)參數(shù)類似,可以有多個(gè)但不是越多越好,建議不要超過三個(gè),但不絕對(duì)。因?yàn)橐话銋?shù)過多的函數(shù)就需要考慮重構(gòu)。

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
  • 閉包捕獲外部變量實(shí)際是為了保證閉包安全執(zhí)行,延長(zhǎng)了外部變量的聲明周期保證閉包調(diào)用時(shí)外部變量生命周期與閉包統(tǒng)在。

6.12 小結(jié)

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容