1. 闭包函数的定义
    • 在 Swift 中,闭包是可以在代码中传递和使用的独立功能块。它类似于函数,但可以捕获和存储其所在上下文中的变量和常量,即使这些变量和常量的生命周期已经结束。简单来说,闭包是一种能够访问和操作其定义环境中的变量的函数。
    • 从语法形式上看,闭包可以被看作是一个匿名函数(没有名字的函数),它可以作为参数传递给其他函数,也可以作为函数的返回值。
  2. 闭包函数的基本语法形式
    • 闭包表达式的一般形式如下:
    • { (parameters) -> returnType in statements }
    • 其中,parameters是闭包的参数列表,returnType是闭包的返回值类型,in关键字用于分隔参数列表和闭包体中的语句。例如,一个简单的闭包,它接受两个整数参数并返回它们的和:
    • let addClosure = { (a: Int, b: Int) -> Int in return a + b }
    • 然后可以像调用函数一样调用这个闭包:let result = addClosure(3, 4),这里result的值为 7。
  3. 闭包函数作为参数传递
    • 函数可以将闭包作为参数。例如,有一个函数,它接受一个闭包作为参数,这个闭包接受一个整数参数并返回一个布尔值。
    • func operateOnNumbers(numbers: [Int], condition: (Int) -> Bool) -> [Int] {
          var result: [Int] = []
          for number in numbers {
              if condition(number) {
                  result.append(number)
              }
          }
          return result
      }
      

   - 可以这样使用这个函数:
   - ```swift
     let numbers = [1, 2, 3, 4, 5]
     let evenNumbers = operateOnNumbers(numbers: numbers) { (number) -> Bool in
         return number % 2 == 0
     }
     // 此时evenNumbers数组包含[2, 4]

  1. 闭包函数作为返回值
    • 函数也可以返回一个闭包。例如,一个函数返回一个闭包,这个闭包每次被调用时会增加一个内部的计数器并返回计数器的值。
    • func makeCounter() -> () -> Int {
          var count = 0
          let incrementAndReturn: () -> Int = {
              count += 1
              return count
          }
          return incrementAndReturn
      }

plaintext

   - 可以这样使用:
   - ```swift
     let counter = makeCounter()
     print(counter()) // 输出1
     print(counter()) // 输出2

  1. 尾随闭包语法
    • 当一个函数的最后一个参数是闭包时,可以使用尾随闭包语法。这可以让代码更易读。例如,对于上面的operateOnNumbers函数,使用尾随闭包语法可以写成:
    • let oddNumbers = operateOnNumbers(numbers: numbers) { number in
          return number % 2!= 0
      }
      // 此时oddNumbers数组包含[1, 3, 5]
      

   - 如果闭包是函数的唯一参数,还可以省略括号,例如:
   - ```swift
     numbers.map { $0 * 2 }
     // 这会返回一个新的数组,其中每个元素都是原数组元素的两倍
 

省略括号之后, $0 * 2 表示什么意思

  1. 语法背景
    • 在 Swift 中,当使用尾随闭包语法并且闭包是函数(如mapfilter等)的唯一参数时,可以省略括号。在这种情况下,$0$1等是一种简洁的参数表示方式。
  2. $0的含义
    • 在闭包中,$0是一种缩写,它代表闭包的第一个参数。如果闭包有多个参数,那么$1代表第二个参数,$2代表第三个参数,以此类推。
    • 例如,对于数组的map函数,它接受一个闭包作为参数,这个闭包接受一个和数组元素类型相同的参数,并返回一个相同类型或可转换为数组元素类型的新值。当使用$0时,在numbers.map { $0 * 2 }这个例子中,$0就代表numbers数组中的每个元素。
    • 完整地写出来,上面的map操作相当于:
    • numbers.map { (element) in
          return element * 2
      }
      

 这里的`element`和`$0`的作用是一样的,都是指代数组`numbers`中的每个元素。`map`函数会遍历`numbers`数组,将每个元素依次传递给闭包,闭包对每个元素进行乘以2的操作,然后`map`函数收集所有闭包返回的值,组成一个新的数组并返回。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐