標籤: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