问题历史: Trailing closure 语法是 Swift 引入的一种语法结构,旨在提高代码的可读性,尤其是在使用函数末尾的闭包(closures)时。它简化了处理大型和嵌套闭包的工作,尤其是在函数式和声明式风格中。
问题: 标准闭包声明中有大量括号,使得代码的视觉结构变得复杂,降低了理解程度:
UIView.animate(withDuration: 0.3, animations: { ... })
随着闭包大小的增加,这段代码的可读性变得更低。
解决方案: Swift 允许将最后一个参数函数置于括号外:
UIView.animate(withDuration: 0.3) { // 动画块 }
如果有两个或更多的闭包,trailing closure 语法仅适用于最后一个闭包参数,其他的必须在圆括号内指定。
关键特点:
如果闭包不是函数的最后一个参数,可以使用 trailing closure 语法吗?
不行,只有最后一个参数可以被写成 trailing closure。如果需要多个闭包,只有最后一个可以放在括号外,其他的必须放在圆括号内。
func fetch(url: String, completion: () -> Void, onError: () -> Void) fetch(url: "...", completion: { ... }) { // onError }
在调用一个只有一个闭包参数的方法时,可以省略圆括号吗?
可以,如果函数只接受一个闭包作为参数,可以完全省略括号:
func doWork(action: () -> Void) doWork { print("任务") }
可以在闭包之后使用 trailing closure 语法来调用带有可变参数的函数吗?
不行,trailing closure 语法仅适用于闭包作为最后一个参数。在其后不能有可变参数或其他参数。以下代码将导致错误:
func test(x: () -> Void, y: Int...) // ... 调用在 trailing closure 方式下不可行
两个闭包参数的调用没有使用 trailing 语法,导致方法垂直占用 5 屏幕,理解难度增加。
优点:
缺点:
在实现 UICollectionViewCompositionalLayout 时使用了 trailing closure——布局块易于阅读,结构直观地反映布局组件的层次。
优点:
缺点: