[Swift 5.3預覽] Multiple Trailing Closures

Snoopy
史努比的第一個家
3 min readMay 11, 2020

前言

不知道這裡有沒有經常使用尾隨閉包的朋友?或是覺得這種寫法太簡單、過度省略而不愛的人存在?

今回,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

--

--