Swift基础入门知识学习(11-1)-闭包-第一篇-讲给你懂
闭包及其運用
可能很多人用了很久的闭包都还不太清楚闭包到底是什么,在这里提供一個理解思路供参考。
闭包本质上和函数一样都是代码块,而闭包更加灵活。
闭包、嵌套函数、函数
更好地使用闭包前需要理清3者的联系和区别。
首先看3种函数的定义:
函数
func eatApple1(_ a: Int, _ b: Int) -> Int {
return a + b
}
闭包
var eatApple2 = {(a: Int, b: Int) -> Int in
return a + b
}
嵌套函数
func eatApple3(_ a: Int, _ b: Int) -> Int {
//嵌套函数
func eatApple(a: Int, b: Int) -> Int {
return a + b
}
return eatApple(a: a, b: b)
}
調用
eatApple1(3, 3)
eatApple2(3, 3)
eatApple3(3, 3)
从上面的定义可以看出函数和嵌套函数其实是一回事,唯一的区别是,嵌套函数是定义在一个函数内部的函数,对外部是隐藏的,只能在其定义的函数内部有效。而闭包与函数的不同要多一些:
- 不需要使用func关键字。
- 函数有名称如:eatApple,而闭包是没有名称的。
- 闭包的参数和函数体都要使用{ }包起来,在参数后要使用in关键字连接函数体。
- 闭包可以作为一种类型赋值给一个变量,上面代码中的闭包类型是: (Int, Int) -> Int 。
上面从定义上分析了三者的不同。
多个参数的闭包
为了确保一切都清楚,我们将使用两个参数编写另一个闭包示例。
这一次,我们的travel()功能将需要闭包。指定某人旅行到哪里,以及他们要走的速度。这意味着我们需要为参数的类型使用(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!")
}
我们将使用尾随闭包和闭包参数簡称来调用它。由于这接受两个参数,我们将获得$0和$1:
travel {
"I'm going to \($0) at \($1) miles per hour."
}
有些人更傾向不使用$0闭包参数簡称,因为它可能会令人混淆。没关系,都可以,打你喜歡的代碼就好。
理论上,闭包可以随你所欲地使用参数,但在实践中,通常看到的大多数示例都使用零到三个参数。使用$0、$1和$2可能是我们可以合理处理的闭包参数簡称,了解这個事实可能会对你有所帮助。
不是说你不能写超過四个或更多参数的闭包,只是這樣的情況非常罕见,大多一两个参数,三个参数都不常見了。
闭包总结
- 可以为变量分配闭包,然后调用它们。
- 闭包可以接受参数并返回值,就像是一般的函数。
- 可以将闭包作为参数传给函数,这些闭包可以有自己的参数和返回值。
- 如果函数的最后一个参数是闭包,可以使用尾随闭包语法。
- Swift提供$0和$1闭包参数簡称,但不是每个人都要使用它。
- 如果在闭包中使用外部值,它们将被捕获,以便闭包稍后可以引用。