100 Days of Swift - Day 06 - 闭包Closures
6.1 闭包
- Swift函数也属于一种数据类型,和String、Integers 类似,可以创建变量,使用变量来调用函数,函数也可以作为另一个函数的参数被使用。
这种使用函数的方式就是闭包。
- eg:使用匿名函数创建变量,即闭包
let driving = {
print("I'm driving in my car")
}
driving()
- 闭包到底是什么? 为什么Swift如此喜欢闭包?
- 闭包功能强大,但也常让人捉摸不透,闭包最擅长异步调用或存储。
- 示例:
- 延迟后执行一些任务
- 动画完成后执行一些任务
- 下载完成后执行一些任务
- 当用户菜单选中一个选项之后执行一些任务
6.2 有参闭包
- 闭包参数列表在大括号内关键字 in 之前的小括号中,参数名: 参数类型,参数之间用逗号分开
let driving = { (place: String) in
print("I'm going to \(place) in my car")
}
- 有参闭包在调用时比函数简便,无需参数标签,直接根据位置在设置参数即可。
driving("London")
// 有参函数
func pay(user: String, amount: Int) {
// code
}
// 有参闭包
let payment = { (user: String, amount: Int) in
// code
}
- 闭包参数在大括号内,参数列表在小括号内,in 关键字之前截止,这样是为了避免和元组Tuple混淆。
6.3 有返回值闭包
- 闭包可以像函数那样返回数据, in 关键字之前,参数列表后,-> 返回值类型
let drivingWithReturn = { (place: String) -> String in
return "I'm going to \(place) in my car"
}
let message = drivingWithReturn("London")
print(message)
// 有参闭包返回数据
let payment = { (user: String) -> Bool in
print("Paying \(user)…")
return true
}
// 无参闭包返回数据
let payment = { () -> Bool in
print("Paying an anonymous person…")
return true
}
6.4 闭包作为参数
- 闭包和其他数据类型 String、Integer类似可以作为参数使用。
// 定义一个闭包
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)
函数体为一个任务A,参数闭包为耗时任务B,任务B需要在A任务之后执行,然后返回数据.
6.5 尾随闭包
- 当函数的最后一个参数是闭包类型时,称之为尾随闭包。尾随闭包可以简写。
// 函数最后一个参数是闭包类型
func travel(action: () -> Void) {
print("I'm getting ready to go.")
action()
print("I arrived!")
}
// 调用函数
travel() {
print("I'm driving in my car")
}
// 简写尾随闭包
travel {
print("I'm driving in my car")
}
// 函数有多个参数,最后一个参数是闭包类型
func animate(duration: Double, animations: () -> Void) {
print("Starting a \(duration) second animation…")
animations()
}
// 正常写法
animate(duration: 3, animations: {
print("Fade out the image")
})
// 尾随闭包简写
animate(duration: 3) {
print("Fade out the image")
}