什么是Swift中的尾随闭包语法?

时间:2016-04-21 07:07:31

标签: swift

斯威夫特的documentation on closures州:

  

Swift的闭包表达式具有干净,清晰的风格,优化可以在常见场景中鼓励简洁,无杂乱的语法。这些优化包括:

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

Swift闭包的“尾随闭包语法”究竟是什么?

4 个答案:

答案 0 :(得分:2)

在函数调用的括号后面写上结尾的闭包,即使它仍然是函数的参数。使用尾随闭包语法时,请勿在函数调用的过程中为闭包编写参数标签。

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

    closure(number * number * number)

}

doSomething(number: 100) { (numberCube) in

    print(numberCube) // prints  1000000

}

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

答案 1 :(得分:1)

  
      
  1. 一个闭包表达式,写在(和之后)之外   函数的括号称为支持
  2.   

你有一个需要函数作为参数的函数

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

调用函数并给出函数作为参数,但参数在paranthesis之外,因此trailing函数作为参数。但它没有名称,它是一个匿名函数,所以它必须是一个闭包。 Tada是一个尾随的关闭。

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

答案 2 :(得分:0)

如果您需要将闭包表达式作为函数的最终参数传递给函数,并且闭包表达式很长,那么将其写为尾随闭包可能会很有用。即使在函数调用的参数后面,也要在函数调用的括号后面加上结尾的闭包。使用尾随闭包语法时,请勿在函数调用的过程中为闭包编写参数标签。

 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
}

答案 3 :(得分:0)

  

尾随关闭

     

如果您需要将闭包表达式作为函数的最终参数传递给函数,并且闭包表达式很长,那么将其写为尾随闭包可能会很有用。即使在函数调用的参数后面,也要在函数调用的括号后面加上结尾的闭包。使用尾随闭包语法时,请勿在函数调用的过程中为闭包编写参数标签。

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
}