Swift學習之每日一tip (5)@autoclosure

來源:互聯網
上載者:User

標籤:autoclosu   swift   閉包   

@autoclosure 可以說是 Apple 的一個非常神奇的創造

簡單說,@autoclosure 做的事情就是把一句運算式自動地封裝成一個閉包 (closure)。這樣有時候在文法上看起來就會非常漂亮。

比如我們有一個方法接受一個閉包,當閉包執行的結果為 true 的時候進行列印:

func logIfTrue(predicate: () -> Bool) {    if predicate() {        println("True")    }}

在調用的時候,我們需要寫這樣的代碼

logIfTrue({return 2 > 1})

當然,在 Swift 中對閉包的用法可以進行一些簡化,在這種情況下我們可以省略掉 return,寫成:

logIfTrue({2 > 1})

還可以更近一步,因為這個閉包是最後一個參數,所以可以使用尾隨閉包 (trailing closure) 的方式把大括弧拿出來,然後省略括弧,變成:

logIfTrue{2 > 1}

但是不管那種方式,要麼是書寫起來十分麻煩,要麼是表達上不太清晰,看起來都讓人生氣。於是 @autoclosure 登場了。我們可以改換方法參數,在參數名前面加上 @autoclosure 關鍵字:

func logIfTrue(@autoclosure predicate: () -> Bool) {    if predicate() {        println("True")    }}

這時候我們就可以直接寫:

logIfTrue(2 > 1)

來進行調用了,Swift 將會吧 2 > 1 這個運算式自動轉換為 () -> Bool。這樣我們就得到了一個寫法簡單,表意清楚的式子。

最後要提一句的是,@autoclosure 並不支援帶有輸入參數的寫法,也就是說只有形如 () -> T 的參數才能使用這個特性進行簡化。另外因為調用者往往很容易忽視 @autoclosure 這個特性,所以在寫接受 @autoclosure 的方法時還請特別小心,如果在容易產生歧義或者誤解的時候,還是使用完整的閉包寫法會比較好。

Swift學習之每日一tip (5)@autoclosure

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.