又到了發文的時間了,最近我的屁股一直長疔子真的好痛,有人知道要怎麼治標嗎,一直跪著打程式也不是辦法吧...,希望有經驗的朋友能夠給我建議。哭啊~~
當學會如何寫func又突然看到名為Closure的東西時真得會一個頭兩個大,而且他們看起來也超像,真的不能只學一個嗎?答案當然是可以阿,只要你不要寫Closure就不要學^^,好拉還是要學一下畢盡在開發上它的用武之地真的還蠻多地方的,那我們就趕快開始吧。
首先讓我們複習一般函式的寫法
func addition(num1:float ,num2:float)-> Float {
return num1 + num2
}
addition( num1:3 , num2:5 )
// 8
這是一個加法的函式,若不了解的話記得先去看函式怎麼寫,BTW和JS相較之下真的有點差異。
目前我們先把它想成沒有名字的函式。在JS的話匿名函式最常使用的函式是箭頭函式吧...。
我們先了解一般函式改成Closure的幾個步驟
1.將函式名及函式名稱刪除
2.若有參數則把他放入大括號內
3.把參數放入大括號內後加入in
範例
let addtion = { (num1:Float, num2:Float) -> Float in return num1 + num2 } addtion(2, 5) // 7
此時你會發現func及closure的第一個不同:在呼叫closure時沒有參數名
答案是有的!
那是什麼?我們還是利用上面的例子,我們已經將Closure放進變數addtion裡面了,並且透過addtion來呼叫。
而我們也可以加上addtion的型別
let addtion:(Float,Float)->Float = { (num1:Float, num2:Float) -> Float in return num1 + num2 } addtion(2, 5) //7
此型別為接受兩個浮點數為參數之後回傳一個浮點數值
其實阿,不用把closure看的這麼複雜,其實他就是一個值而已,就像 x = 3 一樣是一個值而已。
沒錯就是如此closure可以當參數和回傳值,因為剛剛才說到closure就是一個值而已所以有何不可呢。
現在我們來示範如何把closure當作參數吧。
func calculate(num1:Float,num2:Float, operation:(Float,Float)->Float){
print(operation(num1,num2))
}
calculate(num1: 2, num2: 5, operation: addtion)
// 7
此作法為先建立一個名為calculate的函式,此函式必須有三個參數,其中名為operation的參數,需傳入接受兩個浮點數並回傳一個浮點數的型別,誒~~有沒有很熟悉啊,跟我們一開始建立的addtion很像呦,沒錯不要懷疑就放進去吧,就跟你平常一樣放進去吧^^,在呼叫calculate的時候就可以像上面那樣。
closure當然也可以當作回傳值。
func MutiplyClosure()->(Float,Float)->Float{
return addtion
}
let doMutiply = MutiplyClosure()
doMutiply(3,5)
// 8
其實滿好理解的對吧!!
下次我來整理如何簡寫你的Closure讓他看起來更加簡潔,好拉我要去睡覺了掰掰。