iT邦幫忙

0

IOS Swift 什麼是Closure?不能只會func嗎?

前言:

又到了發文的時間了,最近我的屁股一直長疔子真的好痛,有人知道要怎麼治標嗎,一直跪著打程式也不是辦法吧...,希望有經驗的朋友能夠給我建議。哭啊~~
https://ithelp.ithome.com.tw/upload/images/20210423/201367535Eza9QX1ee.jpg


不能只會func嗎?

當學會如何寫func又突然看到名為Closure的東西時真得會一個頭兩個大,而且他們看起來也超像,真的不能只學一個嗎?答案當然是可以阿,只要你不要寫Closure就不要學^^,好拉還是要學一下畢盡在開發上它的用武之地真的還蠻多地方的,那我們就趕快開始吧。

首先

首先讓我們複習一般函式的寫法

func addition(num1:float ,num2:float)-> Float {
    return num1 + num2
}

addition( num1:3 , num2:5 )
// 8

這是一個加法的函式,若不了解的話記得先去看函式怎麼寫,BTW和JS相較之下真的有點差異。

什麼是Closure?

目前我們先把它想成沒有名字的函式。在JS的話匿名函式最常使用的函式是箭頭函式吧...。

把上面的函式改成Closure

我們先了解一般函式改成Closure的幾個步驟
1.將函式名及函式名稱刪除
2.若有參數則把他放入大括號內
3.把參數放入大括號內後加入in

範例

let addtion = { (num1:Float, num2:Float) -> Float in
  return num1 + num2
}

addtion(2, 5)
// 7

此時你會發現func及closure的第一個不同:在呼叫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當作參數

現在我們來示範如何把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當作回傳值

closure當然也可以當作回傳值。

func MutiplyClosure()->(Float,Float)->Float{
    return addtion
}

let doMutiply = MutiplyClosure()
doMutiply(3,5)

// 8

其實滿好理解的對吧!!
下次我來整理如何簡寫你的Closure讓他看起來更加簡潔,好拉我要去睡覺了掰掰。


尚未有邦友留言

立即登入留言