前言
不知道這裡有沒有經常使用尾隨閉包的朋友?或是覺得這種寫法太簡單、過度省略而不愛的人存在?
今回,Swift預計要在Swift 5.3版本,加入Multiple Trailing Closures(多重尾隨閉包)了。主要可以解決只能讓最後一個必包省略,前後程式碼一致性不一致的問題。
官方說法也提到『不對稱性使人不安(the asymmetry is unsettling)』,讓一個語言有整潔的程式碼(Clean Code)果然還是很重要的呢。
但也可以說是一時省略一時爽,一直省略一直爽的概念。
用法
請見官方範例,原本我們的animate方法有兩個closure為:animations與completion,都先按照規範寫在()區塊內。
// Without trailing closure:
UIView.animate(withDuration: 0.3, animations: {
self.view.alpha = 0
}, completion: { _ in
self.view.removeFromSuperview()
})
原本我們可能會把第二個最尾端closure的completion區塊省略,而animations則留在function的括號”( )”之間。
形成一種closure一半在內、一半在外如下:
// With trailing closure
UIView.animate(withDuration: 0.3, animations: {
self.view.alpha = 0
}) { _ in
self.view.removeFromSuperview()
}
現在則可以直接全部寫在參數外面了,如下:
// Multiple trailing closure arguments
UIView.animate(withDuration: 0.3) {
self.view.alpha = 0
} completion: { _ in
self.view.removeFromSuperview()
}
詳細規則如下:
* 第一個尾隨閉包會取消掉他的參數名(argument label)
* 之後的尾隨閉包必須要有參數名
來源:
Swift Evolution
https://github.com/apple/swift-evolution/blob/master/proposals/0279-multiple-trailing-closures.md