swift中闭包函数是什么意思?以及尾随闭包语法$0表示什么含义

110 阅读3分钟

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

    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. 闭包函数作为返回值
    <ul>
    	<li>函数也可以返回一个闭包。例如,一个函数返回一个闭包,这个闭包每次被调用时会增加一个内部的计数器并返回计数器的值。</li>
    	<li>
    	<pre>
    

    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. 尾随闭包语法
    <ul>
    	<li>当一个函数的最后一个参数是闭包时,可以使用尾随闭包语法。这可以让代码更易读。例如,对于上面的<code>operateOnNumbers</code>函数,使用尾随闭包语法可以写成:</li>
    	<li>
    	<pre>
    

    let oddNumbers = operateOnNumbers(numbers: numbers) { number in return number % 2!= 0 } // 此时oddNumbers数组包含[1, 3, 5]

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

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

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

    numbers.map { (element) in return element * 2 }

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