標籤:閉包 swift auto closure
在Swift中方法終於成為了“一等公民”,可以作為參數被方法利用,在接觸今天的內容之前,你必須瞭解Swift中方法和閉包的概念。Swift支援方法嵌套,Swift中的方法和閉包在類型上是有區別的。也就是說傳入方法類型的參數也可以接收閉包,可是方法只能傳入匹配方法傳回值類型的參數,也就是說在運行方法前需要先執行參數中的方法算出傳回值在傳入參數運行調用該參數的方法,如果在一個方法中使用了多個判斷語句可以提前中斷,那麼很多時候不需要知道後面的參數的具體值,比如下面的例子
func expensiveMethod() -> Bool{ NSThread.sleepForTimeInterval(10.0) println("執行了很久") return true }
另外一個方法and需要傳入兩個Bool類型的參數:
func and(first:Bool,second:Bool)->Bool{ println("執行and方法") return first&&second }
現在調用試試:
let result = and(false, second: expensiveMethod())
你會發現速度非常的慢,這是因為先運行expensiveMethod方法算出了傳回值再去執行and方法的方法體。中控台列印:
執行了很久
執行and方法
而可能and方法的結果只通過第一個參數就可以執行了,這時候更好的辦法是把第二個參數改為返回Bool類型的方法,然後傳入一個閉包:
func and(first:Bool,getSecond:()->Bool)->Bool{ if !first{ return false }else{ return getSecond() } }
調用的方法也要修改:
let result = and(false, getSecond: { return self.expensiveMethod()})
這樣的修改運行速度變快了,但是程式員使用這個API的時候需要寫完整的閉包結構,比較麻煩,這個時候@autoclosure就派上用場了。使用這個修飾符可以使API調用時輸入傳回值即可:
func and(first:Bool,@autoclosure getSecond:()->Bool)->Bool{ if !first{ return false }else{ return getSecond() } }
這樣在調用時就可以簡化輸入了:
let result = and(false, getSecond: expensiveMethod())
要注意的是@autoclosure只能用在()->T這樣無參數的閉包中
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
使用@autoclosure提高Swift代碼品質