100 Days of Swift - Day 07 - 閉包Closures part 2
6.6 有參閉包作為函數(shù)參數(shù)
- 定義有參函數(shù),函數(shù)參數(shù)為有參閉包
func travel(action: (String) -> Void) {
print("I'm getting ready to go.")
// 4. 函數(shù)體調(diào)用閉包
action("London")
print("I arrived!")
}
let parameterBlock = { (place: String) in
// 5. 執(zhí)行閉包,使用閉包傳入的參數(shù)
print("I'm going to \(place) in my car")
}
- 調(diào)用函數(shù),傳入 有參閉包 作為 函數(shù)參數(shù)
travel(action: parameterBlock)
I'm getting ready to go.
I'm going to London in my car
I arrived!
6.7 有返回值閉包作為函數(shù)參數(shù)
- 定義有參函數(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!")
}
let returnValueBlock = { (place: String) -> String in
// 5. 執(zhí)行閉包,使用閉包傳入的參數(shù),并返回一個(gè)數(shù)據(jù)
return "I'm going to \(place) in my car"
}
- 調(diào)用函數(shù),傳入有參閉包作為函數(shù)參數(shù)
travel(action: returnValueBlock)
6.8 簡(jiǎn)化閉包
- 定義有參函數(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!")
}
- 調(diào)用函數(shù),傳入有返回值閉包作為參數(shù)
travel { (place: String) -> String in
return "I'm going to \(place) in my car"
}
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"
}
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ù)閉包
- 定義有參函數(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ù)返回值。
- 定義有參函數(shù),函數(shù)返回值為有參有閉包
func travel() -> (String) -> Void {
return {
print("I'm going to \($0)")
}
}
- 調(diào)用函數(shù),接收函數(shù)返回值
let result = travel()
result("London")
travel()("London")
6.11 閉包捕獲外部變量
func travel() -> (String) -> Void {
var counter = 1
return {
print("\(counter). I'm going to \($0)")
counter += 1
}
}
let result = travel()
result("London")
result("London")
result("London")
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)其生命周期直至閉包銷毀