100 Days of Swift - Day 06 - 闭包(上)

100 Days of Swift - Day 06 - 闭包Closures

6.1 闭包

  • Swift函数也属于一种数据类型,和String、Integers 类似,可以创建变量,使用变量来调用函数,函数也可以作为另一个函数的参数被使用。
    这种使用函数的方式就是闭包。
  • eg:使用匿名函数创建变量,即闭包
let driving = {
    print("I'm driving in my car")
}
  • 调用闭包
driving()
  • 闭包到底是什么? 为什么Swift如此喜欢闭包?
  • 闭包功能强大,但也常让人捉摸不透,闭包最擅长异步调用或存储。
  • 示例:
    1. 延迟后执行一些任务
    2. 动画完成后执行一些任务
    3. 下载完成后执行一些任务
    4. 当用户菜单选中一个选项之后执行一些任务

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")
}

声明:本文创作来自hackingwithswift

你可能感兴趣的:(100 Days of Swift - Day 06 - 闭包(上))