Swift Review#16[閉包Closure:基本語法]

影山小麥機

--

前言

閉包(closure)大概是我在函式這個單元過後,卡的稍微久一點的一個關卡,主要是弄不清楚閉包到底跟函式有什麼區別,但時間久了之後,可能就會稍微忘掉閉包的一些小基礎,所以閉包這個單元會大致上分成二個部分:

  1. 基礎的閉包樣態
  2. 省略很多東西的閉包

本篇會先描述第一種。

正文

首先,要先進行一下比較:函式v.s.閉包

1.函式的樣子

函式基本上就是上述圖片第一個樣子,它會先宣稱它是func開頭

呼叫的時候,除非在寫函式的時候以”_”作為外部參數,否則不能省略外部參數。

2.閉包的樣子

閉包則是先以let or var 作為開頭,然後直接先指定後面的東西 “={}”

呼叫的時候,直接將值放進去呼叫閉包的()裡就可以了。

閉包裡的參數

不過,光是上一張圖片那樣描述的閉包可能還不夠,閉包有更多的內容是關於參數的,尤其是在{}裡的參數型別設定

而閉包的參數傳入型別與傳出值型別設定,都依靠著in這個標記來讀取前面的參數功能,清楚表明參數的傳入值與傳出值是什麼。

只傳入值的閉包

有傳出值的閉包

跟函式一樣,只要有傳出值型別,如(game:String)->String這樣的樣態,就必須在閉包內部加上Return。

而呼叫閉包的時候,稍微有一點不一樣的則是,帶入值的時候不需要像函式一樣還要加上外部參數名稱,直接將「值」放進去裡面就可以了,如下述的game_comment(“Hades”)就是直接把“Hades”放進去。

其實邏輯都跟函式有點相近,但閉包的語法,其實有更大的重點在於傳入值型別與傳出值型別的描述,像你可能會看到的String->() or (String)->String,這個東西的重要性是閉包在運作的過程裡,最核心的一環。

閉包作為參數

所以,我們大致上知道影響閉包的運作,有很大一部分是in標記之前的傳入值型別與傳出值型別描述,因此,上述提到的有兩種:

  1. 第一種是有值傳入
  2. 第二種是有值傳入,也有值傳出

而現在要描述的第三種比較特別,是閉包作為參數(closures as parameter):

如上面程式碼寫的,先把一個閉包的內容定義好,傳入型別、傳出型別也對應好要傳入的函式,然後,再把定義好的函式,將閉包的內容丟進去函式的呼叫裡面。

當然,閉包跟函式的組合可以很複雜,複雜到想要哭,不過,這邊就簡單的介紹,往後如果有更多的案例,可以繼續在後面的文章繼續的看到。

綜合上述,閉包和函式很像,但是閉包可以有更多功用,像是閉包可以作為參數這點,傳入函式就非常的好用,甚至可以在未來寫程式的時候創造複雜性。

Sign up to discover human stories that deepen your understanding of the world.

--

--

影山小麥機
影山小麥機

Written by 影山小麥機

本職為Mobile工程師,熱愛分享視野,也樂意站在ChatGPT的肩膀上。訂閱小麥機,收割技術、職涯、人生的難題。

No responses yet

Write a response