Swift Review#39[泛型Generic]補充:inout parameter

影山小麥機
6 min readJul 11, 2021

前言

泛型是我目前寫過所有篇章裡面最不想寫的一篇,我也不知道。

目前寫過所有關於Swift的內容,我覺得最多內容的應該是建構器還有協定、除此之外最不想實作的是可選鏈,雖然之後好像會很常用,但林林總總加一加,這些都還不如泛型。

我第一次看到泛型的時候,那麼一個關鍵字叫inout,然後就滿肚子賭爛直接跳過。(我也不知道為什麼。ㄏㄏ )

正文

不過既然都寫了,那就來說說泛型是蝦餃吧。

泛型函式在衝蝦餃?

我對泛型的認識,就是在簡化程式碼。

很多時候我們會遇到那種其實是同樣東西,只不過型別在函式裡面可能是不一樣的時候,那種甘嘎(感覺),然後不小心又要日寫千行的時候,這種明明重複的東西這麼多為什麼不減少一點的時候,火都上來了,泛型恰恰提供了這種對於重複的東西不多提的概念一點省略的思考:

泛型函式有個重點是省略,那省略什麼呢?

我們稍微觀察一下這個函式,我們會發現它跟一般的函式有個區別:那就是它的()前多了個<T>,還有它的括號裡面有inout、T這兩個我們不太懂的東西。

那總得給個交代吧?

引用一下:

上述程式中的函式使用了佔位型別名稱(placeholder type name,習慣以字母T來表示)來代替實際型別名稱(像是IntDoubleString)。

可以注意到函式名稱後面緊接著一組角括號<>,且包著T。這代表角括號內的T是函式定義的一個佔位型別名稱,因此 Swift 不會去查找名稱為T的實際型別。

定義佔位型別名稱時不會明確表示T是什麼型別,但參數ab都必須是這個T型別。而只有當這個函式被呼叫時,才會根據傳入參數的實際型別,來決定T所代表的型別。

總之,上面的描述如果簡化一下,會變成是這樣:T就是任意一種型別的意思,無論是Type….Int….anyway,但是只要T都要是同一種型別,也就是說,在下面這個例子裡面,所有的T的型別都是一樣的(含a、b):

補充:inout parameter

那,圖中的inout指的是什麼東西呢?

100Days of Swift

When you pass value types as parameters into a function, they are constants and so can’t be modified(修改). Sometimes it would be convenient to change this so you can modify the values, and that’s what inoutdoes for us: it lets us modify parameters inside a function, and have those changes persist outside the function.

翻譯翻譯:

當你傳送了一個值型別進到一個函式裡面,他們是常數且無法被修改的。有時候這樣會比較方便去調整,因此,inout提供了這樣的方法給我們:

它讓我們在函式裡面修改參數,也讓這些變化在函式之外持續存在。

When it comes to calling functions with inout parameters, Swift has two rules: we must pass in variables, and we also need to use & before the parameter name to acknowledge that it might be changed.

當我們在需要呼叫函式的時候,使用inout 參數,Swift會產生兩個規則:

  1. 我們必須傳進去變數
  2. 我們也需要使用&這個記號,在參數名稱之前確認它可能會被更改

另外,也有一些資料指出:

Swift的function中的參數都是以pass-by-value的方式傳遞,也就是在function外部先copy一份再帶進function中,而function中的參數預設都是以常數為型態,所以無法修改。

那如果在有些需求當中,我們就是想要直接修改參數值呢?這時就要用到inout這個關鍵字:

inoutcopy-in copy-out的意思,也有人理解為call by value result,顧名思義,加上inout後的行為就是copy一份進來,再copy一份出去

Well,what’s that mean?舉個實際點的例子好了:

就上述的例子來說,所以,有inout的地方,在函式外就應該配與“&”這個標記,讓人知道它是一種複製,而不是單純的值傳入、值傳出,不過,其實說這麼多,要判斷什麼時候要用什麼方式來應用,應該也需要一些實作技術的累積,也許之後會再來多談這方面的東西。

小記:

最後,泛型大概會是我目前Swift Review系列的最後的幾個篇章了,如果還有需要補充的部分,會是以「遇到再說」的原則下去談論,假若有看我的複習文章的人,認為我講的不夠完整,也可以告訴我。

接下來會把主要的心力放在新的篇章Swift on Xcode系列上,那這個篇章最主要,會先從Xcode的一些檔案開始介紹起,我現在能預想到的小主題,大概就是先談談AppDelegate、ViewController、SceneDelegate等到底在App開發中扮演什麼樣的角色,進而會談到所謂的生命週期(Life Cycle)這樣的概念。

然後大概把一些做按鈕之類,畫面的東西學的差不多的時候,就會來搞第一個App,至於第一個App會做什麼⋯⋯我現在想到的是做一個記事本(?),但也許要多問問我的導師。

老實說,現在能讓我繼續學習的動力,其實是在Medium上寫文,每寫完一篇就會知道自己又進步了一點,希望在一陣子之後,從基礎語法到畫面呈現的邏輯,會是一個順暢的過程。

2021.07.11好想工作室Day 14

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

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

影山小麥機
影山小麥機

Written by 影山小麥機

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

No responses yet

Write a response