Swift 中的尾随闭包语法是啥?

Posted

技术标签:

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

Swift 的documentation on closures 声明:

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

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

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

【问题讨论】:

在谷歌上输入swift trailing closure的第一个结果:developer.apple.com/library/ios/documentation/Swift/Conceptual/… hackingwithswift.com/example-code/language/… 【参考方案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】:
    写在外部(和之后)的闭包表达式 它支持的函数调用的括号

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

给你一个用例:

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

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

以上是关于Swift 中的尾随闭包语法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥速记参数名称在这个 Swift 闭包中不起作用?

swift中的闭包总结

Swift初见Swift闭包

Swift 完成处理程序 - 转义尾随闭包

Swift语法之.map

Swift - 闭包表达式语法