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ù),并返回一個數(shù)據(jù)
return "I'm going to \(place) in my car"
}
- 調(diào)用函數(shù),傳入有參閉包作為函數(shù)參數(shù)
travel(action: returnValueBlock)
6.8 簡化閉包
- 定義有參函數(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ù)類型鸟款、省略返回值類型膏燃、省略返回值關鍵字
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"
}
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ù)閉包
- 定義有參函數(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ù)返回值。
- 定義有參函數(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
- 閉包捕獲外部變量實際是為了保證閉包安全執(zhí)行,延長了外部變量的聲明周期保證閉包調(diào)用時外部變量生命周期與閉包統(tǒng)在康辑。
6.12 小結
- 閉包可以作為變量摄欲,函數(shù)參數(shù),函數(shù)返回值使用
- 閉包和函數(shù)類似疮薇,可以設置參數(shù)胸墙,在閉包體內(nèi)使用,也可以返回數(shù)據(jù)
- 如果閉包作為函數(shù)最后一個參數(shù)稱之為尾隨閉包可以簡寫
- Swift允許閉包可以簡寫參數(shù)及返回值
- 閉包捕獲外部變量將延長其生命周期直至閉包銷毀