前言
泛型是我目前寫過所有篇章裡面最不想寫的一篇,我也不知道。
目前寫過所有關於Swift的內容,我覺得最多內容的應該是建構器還有協定、除此之外最不想實作的是可選鏈,雖然之後好像會很常用,但林林總總加一加,這些都還不如泛型。
我第一次看到泛型的時候,那麼一個關鍵字叫inout,然後就滿肚子賭爛直接跳過。(我也不知道為什麼。ㄏㄏ )
正文
不過既然都寫了,那就來說說泛型是蝦餃吧。
泛型函式在衝蝦餃?
我對泛型的認識,就是在簡化程式碼。
很多時候我們會遇到那種其實是同樣東西,只不過型別在函式裡面可能是不一樣的時候,那種甘嘎(感覺),然後不小心又要日寫千行的時候,這種明明重複的東西這麼多為什麼不減少一點的時候,火都上來了,泛型恰恰提供了這種對於重複的東西不多提的概念一點省略的思考:

泛型函式有個重點是省略,那省略什麼呢?
我們稍微觀察一下這個函式,我們會發現它跟一般的函式有個區別:那就是它的()前多了個<T>,還有它的括號裡面有inout、T這兩個我們不太懂的東西。
那總得給個交代吧?
引用一下:
上述程式中的函式使用了佔位型別名稱(
placeholder type name
,習慣以字母T
來表示)來代替實際型別名稱(像是Int
、Double
或String
)。可以注意到函式名稱後面緊接著一組角括號
<>
,且包著T
。這代表角括號內的T
是函式定義的一個佔位型別名稱,因此 Swift 不會去查找名稱為T
的實際型別。定義佔位型別名稱時不會明確表示
T
是什麼型別,但參數a
與b
都必須是這個T
型別。而只有當這個函式被呼叫時,才會根據傳入參數的實際型別,來決定T
所代表的型別。
總之,上面的描述如果簡化一下,會變成是這樣:T就是任意一種型別的意思,無論是Type….Int….anyway,但是只要T都要是同一種型別,也就是說,在下面這個例子裡面,所有的T的型別都是一樣的(含a、b):

補充:inout parameter
那,圖中的inout指的是什麼東西呢?
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
inout
does 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會產生兩個規則:
- 我們必須傳進去變數
- 我們也需要使用&這個記號,在參數名稱之前確認它可能會被更改
另外,也有一些資料指出:
Swift的function中的參數都是以pass-by-value的方式傳遞,也就是在function外部先copy一份再帶進function中,而function中的參數預設都是以常數為型態,所以無法修改。
那如果在有些需求當中,我們就是想要直接修改參數值呢?這時就要用到inout這個關鍵字:
inout為copy-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