前面学习闭包的基础语法,今天再学习一点进阶的内容
闭包简写
1.正常的尾随闭包写法和调用逻辑
func travel(action: (String) -> String) {
print("I'm getting ready to go")
let desc = action("Beijing ")
print(desc)
print("I'm arrived! ")
}
复制代码
travel { (place: String) -> String in
return "1. I'm going to \(place) in my car"
}
复制代码
-
因为Swift能推断闭包参数类型是String ,直接简写成 place就可以
travel { place -> String in
return "2. I'm going to \(place) in my car"
}
复制代码
- 在进一步Swift也知道返回一个字符串,所以我们可以把
-> String
删除它:
travel { place in
return "3. I'm going to \(place) in my car"
}
复制代码
- 由于闭包函数只有一行代码必须是返回值的代码,Swift允许我们删除
return
关键字:
travel { place in
"4. I'm going to \(place) in my car"
}
复制代码
-
你甚至连
place in
都可以省略, Swift 为闭包参数提供了一个自动获取参数的语法, 0`
travel {
"5. I'm going to \($0) in my card"
}
复制代码
简写前后对比
//before
travel { (place: String) -> String in
return "1. I'm going to \(place) in my car"
}
//end
travel {
"5. I'm going to \($0) in my card"
}
复制代码
闭包面接受多参数和返回值 (String, Int) -> String
func travel(action: (String, Int) -> String) {
print("I'm getting ready to go.")
let description = action("London", 60)
print(description)
print("I arrived!")
}
travel {
"6. I'm going to ($0) at ($1) miles per hour."
}
复制代码
闭包值捕获
func travel() -> (String) -> Void {
return {
print("I'm going to \($0)")
}
}
let result = travel2()
result("London ,Beijing")
func travel2() -> (String) -> Void {
var counter = 1
return {
print("\(counter). I'm going to \($0)")
counter += 1
}
}
复制代码
result("London")
result("London")
result("London")
2. I'm going to London
3. I'm going to London
4. I'm going to London
复制代码
闭包能够从上下文捕获已被定义的常量和变量, 即使定义这些常量和变量的原作用域已经不存在,闭包仍能够在其函数体内引用和修改这些值
闭包是引用类型
在Swift中,函数和闭包都是引用类型
无论你在什么时候赋值一个函数或者闭包给常量或者变量,你实际上都是将常量和变量设置为对函数和闭包的引用
测试题
使用今天所学的,一起来简化下下面的函数调用吧,评论区一起讨论
func getDirections(to destination: String, then travel: ([String]) -> Void) {
let directions = [
"Go straight ahead",
"Turn left onto Station Road",
"Turn right onto High Street",
"You have arrived at \(destination)"
]
travel(directions)
}
// 正常调用
getDirections(to: "London") { (directions: [String]) in
print("I'm getting my car.")
for direction in directions {
print(direction)
}
}
复制代码
来简化 getDirections
调用写法
评论区写上你的代码
复制代码
总结下闭包的学习
- 可以将闭包函数分配给变量,后面可以直接调用。
- 闭包可以接受参数和返回值,就像常规函数一样。
- 可以将闭包作为参数传递到函数中,闭包也可以具有自己的参数和返回值。
- 如果函数的最后是闭包参数,则可以使用尾随闭包语法。
- Swift自动提供了参数简写语法,多个参数:1
- 闭包可以捕获外部定义的常量和变量,闭包是引用类型
参考
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END