百日学 Swift(Day 6) – closures part one(闭包:第 1 部分)
1. Creating basic closures(创建基础闭包) – test
在 Swift 中可以像使用其他类型(如字符串和整数)一样使用函数。这意味着可以创建一个函数并将其分配给一个变量,使用该变量调用该函数,甚至将该函数作为参数传递给其他函数。
以这种方式使用的函数称为闭包,尽管它们像函数一样工作,但编写方式有所不同。
让我们从一个简单的示例开始,该示例显示一条消息:
let driving = {
print("我在开车")
}
这样可以有效地创建一个没有名称的函数,并将该函数分配给driving
。现在,您可以driving()
像调用常规函数一样进行调用,如下所示:
driving()
2. Accepting parameters in a closure(在闭包中接受参数) – test
创建闭包时,它们没有名称或空格来写入任何参数。这并不意味着他们不能接受参数,只是他们以不同的方式接受参数:它们在大括号内列出。
要使闭包接受参数,请在开括号后面的括号内列出它们,然后加上in
以便Swift知道闭包的主体正在开始。
例如,我们可以制作一个接受地名字符串作为其唯一参数的闭包,如下所示:
let driving = { (place: String) in
print("我要开车去\(place)")
}
函数和闭包之间的区别之一是,在运行闭包时不使用参数标签。
driving("杭州")
3. Returning values from a closure(从闭包返回值) – test
闭包也可以返回值,它们的写法与参数类似:您可以将其写在闭包中,就在in
关键字之前。
为了说明这一点,我们将使用driving()
闭包并使其返回其值,而不是直接打印它。这是原始的:
let driving = { (place: String) in
print("我要开车去\(place)")
}
我们希望闭包返回一个字符串而不是直接打印消息,因此我们需要使用-> String
before in
,然后return
像普通函数一样使用:
let drivingWithReturn = { (place: String) -> String in
return "我要开车去\(place)"
}
现在,我们可以运行该闭包并打印其返回值:
let message = drivingWithReturn("杭州")
print(message)
4. Closures as parameters(闭包作为参数) – test
因为闭包可以像字符串和整数一样使用,所以可以将它们传递给函数。
首先,这是我们的基本闭包driving()
let driving = {
print("I'm driving in my car")
}
如果我们想将该闭包传递给函数,以便可以在该函数内部运行,则可以将参数类型指定为() -> Void
。这意味着“不接受任何参数,然后返回Void
”
因此,我们可以编写一个travel()
接受各种旅行行为的函数,并在此之前和之后打印一条消息:
func travel(action: () -> Void) {
print("I'm getting ready to go.")
action()
print("I arrived!")
}
现在,我们可以使用driving
闭包来调用它,如下所示:
travel(action: driving)
5. Trailing closure syntax(尾随闭包语法) – test
如果函数的最后一个参数是闭包,Swift 可以使用称为尾随闭包的特殊语法。与其将闭包中作为参数传递,不如在括号内的函数之后直接传递它。
为了证明这一点,这又是我们的travel()
功能。它接受action
闭包,以便可以在两个print()
调用之间运行:
func travel(action: () -> Void) {
print("准备出发")
action()
print("已到达目的地,本次导航结束")
}
因为它的最后一个参数是闭包,所以我们可以对travel()
使用尾随闭包语法进行调用,如下所示:
travel() {
print("高德导航持续为您服务")
}
实际上,由于没有任何其他参数,我们可以完全消除括号:
travel {
print("高德导航持续为您服务")
}
尾随闭包语法在Swift中非常普遍。