【问题标题】:What is trailing closure syntax in Swift?Swift 中的尾随闭包语法是什么?
【发布时间】:2016-04-21 07:07:30
【问题描述】:

Swift 的documentation on closures 声明:

Swift 的闭包表达式具有简洁明了的风格,并通过优化来鼓励在常见场景中使用简洁、整洁的语法。这些优化包括:

  • 从上下文推断参数和返回值类型
  • 单表达式闭包的隐式返回
  • 简写参数名称
  • 尾随闭包语法

Swift 闭包的“尾随闭包语法”到底是什么?

【问题讨论】:

标签: swift


【解决方案1】:

一个尾随闭包写在函数调用的括号之后,即使它仍然是函数的参数。当您使用尾随闭包语法时,您不会将闭包的参数标签作为函数调用的一部分。

func doSomething(number:Int, onSuccess closure:(Int)->Void) {

    closure(number * number * number)

}

doSomething(number: 100) { (numberCube) in

    print(numberCube) // prints  1000000

}

函数调用中没有参数标签 onSuccess。即使闭包包含在函数参数列表中,swift 也会将其从参数块中取出以使代码更具可读性。

【讨论】:

    【解决方案2】:
    1. 写在外部(和之后)的闭包表达式 它支持的函数调用的括号

    只是语法糖少写,更容易阅读。

    给你一个用例:

    你有一个函数需要另一个函数(或闭包)作为参数:

    func fooFunc(paramfunc: () -> Void) {
        paramfunc();
    }
    

    调用函数并将函数作为参数是正常的。给它一个闭包意味着你给出的参数是一个写在{}之间的无名函数,并且在开头有类型签名(它是一个匿名函数)。

    在调用需要函数作为参数的函数并在括号后编写闭包或如果括号是唯一参数(Swift 5.3 中出现多个尾随闭包)时省略括号,则使其成为尾随闭包语法。

    fooFunc { () -> Void in
        print("Bar");
    }
    
    fooFunc() { () -> Void in
        print("Bar");
    }
    

    函数名后面的括号甚至可以省略。

    【讨论】:

      【解决方案3】:

      如果您需要将闭包表达式作为函数的最终参数传递给函数并且闭包表达式很长,则将其编写为尾随闭包会很有用。尾随闭包写在函数调用的括号之后,即使它仍然是函数的参数。当您使用尾随闭包语法时,您不会将闭包的参数标签作为函数调用的一部分。

       func funcWithATrailingClosure(closure: () -> Void) {
      // function body goes here
       }
      
      // Here's how you call this function without using a trailing closure:
      funcWithATrailingClosure(closure: {
      // closure's body goes here
      })
      
      // Here's how you call this function with a trailing closure instead:
      funcWithATrailingClosure() {
      // trailing closure's body goes here
      }
      

      【讨论】:

      • () 也可以省略。 someFunctionThatTakesAClosure { }
      【解决方案4】:

      尾随闭包

      如果您需要将闭包表达式作为函数的最终参数传递给函数并且闭包表达式很长,则将其编写为尾随闭包会很有用。尾随闭包写在函数调用的括号之后,即使它仍然是函数的参数。当您使用尾随闭包语法时,您不会将闭包的参数标签作为函数调用的一部分。

      https://docs.swift.org/swift-book/LanguageGuide/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID102

      func someFunctionThatTakesAClosure(closure: () -> Void) {
          // function body goes here
      }
      
      // Here's how you call this function without using a trailing closure:
      
      someFunctionThatTakesAClosure(closure: {
          // closure's body goes here
      })
      
      // Here's how you call this function with a trailing closure instead:
      
      someFunctionThatTakesAClosure() {
          // trailing closure's body goes here
      }
      

      如果提供闭包表达式作为函数或方法的唯一参数,并且您将该表达式作为尾随闭包提供,则在调用函数时无需在函数或方法的名称后写一对括号 ():

      reversedNames = names.sorted { $0 > $1 }
      

      【讨论】:

      • () 也可以省略。 someFunctionThatTakesAClosure { }
      猜你喜欢
      • 1970-01-01
      • 2019-08-14
      • 2020-11-22
      • 1970-01-01
      • 2020-10-09
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      相关资源
      最近更新 更多