闭包
大约 2 分钟
闭包
创建基本闭包
创建了一个没有名称的函数,并将该函数分配给playing:
let playing = {
print("I am to play basketball")
}
现在可以调用driving(),就像一个常规函数一样:
driving()
闭包参数
接受地名字符串作为其唯一的参数:
let playing = { (place: String) in
print("I'm going to \(place) to play basketball")
}
函数和闭包有个区别是运行闭包时不使用参数标签。现在要调用playing():
playing("Beijing")
闭包返回值
需要in之前使用-> String,然后像正常函数一样使用return:
let playingWithReturn = { (place: String) -> String in
return "I'm going to \(place) to play basketball"
}
调用闭包并打印其返回值:
let message = playingWithReturn("Beijing")
print(message)
闭合作为参数
把该闭包传递到函数中以便可以在该函数内运行,将参数类型指定为() -> Void。参数闭包“不接受任何参数,并返回Void”:
func travel(action: () -> Void) {
print("I'm getting ready to go.")
action()
print("I arrived!")
}
定义闭包:
let playing = {
print("I am to play basketball")
}
调用带参数为闭包的函数:
travel(action: playing)
尾随闭包
如果函数的最后一个参数是闭包,Swift允许使用特殊语法 calledtrailing 闭包语法。 与其将闭包作为参数传递,不如直接在大括号内的函数之后传递它:
func travel(action: () -> Void) {
print("I'm getting ready to go.")
action()
print("I arrived!")
}
多参数闭包
这次函数将需要一个闭包,指定位置和速度。这意味着需要使用(String, Int) -> String作为参数的类型:
func travel(action: (String, Int) -> String) {
print("I'm getting ready to go.")
let description = action("Beijing", 30)
print(description)
print("I arrived!")
}
使用尾随闭包和速记闭包参数名称。接受两个参数得到$0和$1:
travel {
"I'm going to \($0) at \($1) miles per hour."
}
函数返回闭包
就像可以将闭包传递给函数一样,也可以从函数中返回闭包。 一个不接受任何参数但返回闭包的travel()函数:
func travel() -> (String) -> Void {
return {
print("I'm going to \($0)")
}
}
可以调用travel()来获取闭包,然后将其作为函数调用:
let result = travel()
result("Beijing")
从travel()调用返回值也是可以,虽然不推荐:
let result2 = travel()("Beijing")