据说这个很难。加油!

创建一个简单的闭包

我们使用变量来调用函数,甚至将函数通过变量传递给另一个函数。来创建一个简单的闭包:

1
2
3
4
5
let zhhooo = {
print("zhhooo.com")
}

zhhooo()

相当于常量zhhooo中包含了一个没有名字的函数。

在闭包中接受参数

在闭包中可以接受参数,但是参数需要在大括号中编写,并且需要带in。例如:

1
2
3
let zhhooo = {(url: String) in
print("welcome go to \(url) !")
}

函数和闭包的区别就是,闭包在调用的时候不需要标注参数标签,例如:

1
zhhooo("blog.zhhooo.com")

注意:
闭包不能使用外部参数标签

在闭包中返回值

在闭包中可以返回值,写法类似函数。同样是利用return

1
2
3
4
5
6
7
let zhhooo = {(url: String) -> String in
return "let's go to \(url) !"
}

let txt = zhhooo("zhhooo.com")

print(txt)

其他例子:

1
2
3
4
5
6
let drivingWithReturn = { (place: String) -> String in
return "I'm going to \(place) in my car"
}

let message = drivingWithReturn("London")
print(message)

其他例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let measureSize = { (inches: Int) -> String in
switch inches {
case 0...26:
return "XS"
case 27...30:
return "S"
case 31...34:
return "M"
case 35...38:
return "L"
default:
return "XL"
}
}
measureSize(36)

闭包作为参数

之前提到了闭包可以作为参数放入其他函数中,现在它来了~!是的,这是个有毒的语法。它需要参数置顶类型为Void,通过格式<参数>:() -> Void来调用。Void的意思就是告诉Swift我们什么都不做。例如:

1
2
3
4
5
6
7
8
9
10
11
let zhhooo = {
print("hello!zhhooo!~")
}

func tellmeadr(action: () -> Void){
print("Are you Ready?")
action()
print("Let's go!")
}

tellmeadr(action:zhhooo)

其他例子:

1
2
3
4
5
6
7
8
9
let driving = {
print("I'm driving in my car")
}
func travel(action: () -> Void) {
print("I'm getting ready to go.")
action()
print("I arrived!")
}
travel(action: driving)

其他例子:

1
2
3
4
5
6
7
8
let awesomeTalk = {
print("Here's a great talk!")
}
func deliverTalk(name: String, type: () -> Void) {
print("My talk is called \(name)")
type()
}
deliverTalk(name: "My Awesome Talk", type: awesomeTalk)

其他例子:

1
2
3
4
5
6
7
8
var payCash = {
print("Here's the money.")
}
func buyClothes(item: String, using payment: () -> Void) {
print("I'll take this \(item).")
payment()
}
buyClothes(item: "jacket", using: payCash)

尾随闭包语法

还记得刚才的第一个例子吗?我们可以使用尾随闭包语法来书写它。尾随闭包语法是常见的一种闭包语法,它的格式是在调用的时候的一种格式。我们先来看一下最初的例子:

1
2
3
4
5
func tellmeadr(action: () -> Void){
print("Are you Ready?")
action()
print("Let's go!")
}

我们在调用的时候可以不只是写let之后用函数的直接调用,因为这个函数最后一个参数是闭包,我们还可以用这种尾随闭包语法,格式为:<函数名>(){<闭包内容>},例如上一节的第一个例子我们可以转写成:

1
2
3
4
5
6
7
8
9
func tellmeadr(action: () -> Void){
print("Are you Ready?")
action()
print("Let's go!")
}

tellmeadr() {
print("hello!zhhooo!~")
}

成功的省略了常量let的部分。并且因为tellmeadr没有其他参数,我们甚至可以省略掉()

1
2
3
4
5
6
7
8
9
func tellmeadr(action: () -> Void){
print("Are you Ready?")
action()
print("Let's go!")
}

tellmeadr {
print("hello!zhhooo!~")
}

其他例子:

1
2
3
4
5
6
7
8
9
func travel(action: () -> Void) {
print("I'm getting ready to go.")
action()
print("I arrived!")
}

travel() {
print("I'm driving in my car")
}

其他例子:

1
2
3
4
5
6
7
8
9
10
11
func goOnVacation(to destination: String, _ activities: () -> Void) {
print("Packing bags...")
print("Getting on plane to \(destination)...")
activities()
print("Time to go home!")
}
goOnVacation(to: "Mexico") {
print("Go sightseeing")
print("Relax in sun")
print("Go hiking")
}

参考资料

查看下一天的SwiftUI学习笔记

关于100days英文课程