如下為官方文件的定義,但是建議你忽略它,搞懂了自動閉包再來看才容易懂:)
自動閉包是一種自動建立的閉包,用於包裝傳遞給函式作為引數的表示式。這種閉包不接受任何引數,當它被調
用的時候,會返回被包裝在其中的表示式的值。這種便利語法讓你能夠省略閉包的花括號,用一個普通的表示式
來代替顯式的閉包。複製程式碼
這是一個正常的閉包的定義和呼叫:
func foo(_ i:() -> Int) {
print(i())
}
foo({return 42})複製程式碼
結果會列印42出來。可以使用{}
建立一個閉包,並把它傳遞到foo函式,foo函式會列印此閉包的返回結果。當然,因為返回值明確,可以省略return。讓程式碼更加簡潔。
func foo(_ i:() -> Int) {
print(i())
}
foo({42})複製程式碼
你也常常會使用尾隨閉包,把最後一行寫成:
foo(){42}複製程式碼
或者:
foo{42}複製程式碼
然而,使用自動閉包,程式碼可以更省,省掉{}
,就像這樣:
func bar(_ i:@autoclosure () -> Int) {
print(i())
}
bar(42)複製程式碼
42只是一個返回整數的表示式,為什麼可以傳遞給型別為閉包的引數呢?因為加上了@autoclosure標記後,編譯器會自動把傳遞的表示式加上{}
,從而轉換為閉包。這裡的自動就體現在此了。要求就是表示式的返回值和閉包的返回值型別一致即可。
現在你回頭看,官方文件字字都對。但是之前是看不懂的。起碼我看不懂。
能省則省,這樣的語法,儘管程式設計師不一定都用它,但是喜歡。