Swift iOS : 自動閉包autoclosure

RecoReco發表於2017-08-14

如下為官方文件的定義,但是建議你忽略它,搞懂了自動閉包再來看才容易懂:)

自動閉包是一種自動建立的閉包,用於包裝傳遞給函式作為引數的表示式。這種閉包不接受任何引數,當它被調
用的時候,會返回被包裝在其中的表示式的值。這種便利語法讓你能夠省略閉包的花括號,用一個普通的表示式
來代替顯式的閉包。複製程式碼

這是一個正常的閉包的定義和呼叫:

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標記後,編譯器會自動把傳遞的表示式加上{},從而轉換為閉包。這裡的自動就體現在此了。要求就是表示式的返回值和閉包的返回值型別一致即可。

現在你回頭看,官方文件字字都對。但是之前是看不懂的。起碼我看不懂。

能省則省,這樣的語法,儘管程式設計師不一定都用它,但是喜歡。

相關文章