Swift- Closures 闭包(2)-进阶篇

Swift- Closures 闭包 & 尾随闭包学习笔记

前面学习闭包的基础语法,今天再学习一点进阶的内容

闭包简写

1.正常的尾随闭包写法和调用逻辑

 func travel(action: (String) -> String) {

  print("I'm getting ready to go")

  let desc = action("Beijing ")

  print(desc)

  print("I'm arrived! ")

}
复制代码
travel { (place: String) -> String in

  return "1. I'm going to \(place) in my car"

}
复制代码
  1. 因为Swift能推断闭包参数类型是String ,直接简写成 place就可以

travel { place -> String in

  return "2. I'm going to \(place) in my car"

 }
复制代码
  1. 在进一步Swift也知道返回一个字符串,所以我们可以把-> String删除它:
 travel { place in 

  return "3. I'm going to \(place) in my car"

 }
复制代码
  1. 由于闭包函数只有一行代码必须是返回值的代码,Swift允许我们删除return关键字:
travel { place in

  "4. I'm going to \(place) in my car"

 }
复制代码
  1. 你甚至连 place in都可以省略, Swift 为闭包参数提供了一个自动获取参数的语法, +参数序号:palce=+参数序号:`palce = 0`

 travel { 

  "5. I'm going to \($0) in my card"

 }
复制代码

简写前后对比

 //before
 travel { (place: String) -> String in

  return "1. I'm going to \(place) in my car"

 }
 
 //end
 travel { 

  "5. I'm going to \($0) in my card"

 }
复制代码

闭包面接受多参数和返回值 (String, Int) -> String

 func travel(action: (String, Int) -> String) {

  print("I'm getting ready to go.")

  let description = action("London", 60)

  print(description)

  print("I arrived!")

 }
 
  travel {

  "6. I'm going to ($0) at ($1) miles per hour."

 }

复制代码

闭包值捕获

 func travel() -> (String) -> Void {

  return {
    print("I'm going to \($0)")

  }
 }

 let result = travel2()

 result("London ,Beijing")

 func travel2() -> (String) -> Void {

  var counter = 1

  return {

    print("\(counter). I'm going to \($0)")

    counter += 1

  }

 }
复制代码
 result("London")

 result("London")

 result("London")

2. I'm going to London
3. I'm going to London
4. I'm going to London
复制代码

闭包能够从上下文捕获已被定义的常量和变量, 即使定义这些常量和变量的原作用域已经不存在,闭包仍能够在其函数体内引用和修改这些值

闭包是引用类型

在Swift中,函数和闭包都是引用类型
无论你在什么时候赋值一个函数或者闭包给常量或者变量,你实际上都是将常量和变量设置为对函数和闭包的引用

测试题

使用今天所学的,一起来简化下下面的函数调用吧,评论区一起讨论

func getDirections(to destination: String, then travel: ([String]) -> Void) {
	let directions = [
		"Go straight ahead",
		"Turn left onto Station Road",
		"Turn right onto High Street",
		"You have arrived at \(destination)"
	]
	travel(directions)
}

// 正常调用
getDirections(to: "London") { (directions: [String]) in
	print("I'm getting my car.")
	for direction in directions {
		print(direction)
	}
}
复制代码

来简化 getDirections 调用写法

评论区写上你的代码

复制代码

总结下闭包的学习

  1. 可以将闭包函数分配给变量,后面可以直接调用。
  2. 闭包可以接受参数和返回值,就像常规函数一样。
  3. 可以将闭包作为参数传递到函数中,闭包也可以具有自己的参数和返回值。
  4. 如果函数的最后是闭包参数,则可以使用尾随闭包语法。
  5. Swift自动提供了参数简写语法,多个参数:0,0,1
  6. 闭包可以捕获外部定义的常量和变量,闭包是引用类型

参考

www.hackingwithswift.com/100

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享