前言
繼前兩篇章,分別描述了建構化的基本問題(為何要建構化?)、建構器的規則(內外參數、可選性、常數可修改性),本篇章將繼過往在#19 中所提及之類別、結構中之值型別與參考型別於建構器的議題中,較有區別之部分。
正文
因此,作為值型別、參考型別兩者的區分,結構與類別分別走上了不同的道路,尤其展現在建構器的相關規則上:
建構器代理的實作規則和形式在值型別和類型別中有所不同。
1.值型別:
值型別(結構和列舉型別)不支援繼承,所以建構器代理的過程相對簡單,因為它們只能代理任務給本身提供的其它建構器。
2.參考型別:
類別則不同,它可以繼承自其它類別,這意味著類別有責任保證其所有繼承的儲存型屬性在建構時也能正確的初始化。
所以,基於值型別的建構器,具有「可代理性」,以下,將描述結構在值型別的可代理性一命題之例:

在上述,先分別創建兩個結構,其一Size作為內含預設為0的長與寬,其二Point作為描述點位而預設為0的x,y。
上述兩者結構都是預設值,而今再創建一結構Rect,裡頭先放置兩屬性,分別為前述兩者皆為預設值內容的結構,而在Rect結構下,有三建構器:
- 一為空建構器init( ){ }裡頭什麼都沒有
2. 二為init(origin: Point, size: Size),置入一參數origin,值為Point結構預設值;一參數size,值為Size結構預設值,其中分別賦值導向為參數。
3.三為init(center: Point, size: Size ),將參數origin指向Point預設值,並參數size指向Size預設值,其內容主要是將Point的預設值x取出,扣除Size的預設值width除以2過後的數值,以得到originX,另一式也是如此,不過變換為另一個對象。最後調用第二個建構器,將第二個參數的建構器參數分別填入結構Point中預設的參數,並指向第三個建構器中的originX、originY,參數size指向結構size。
這個例子大量的將結構做為調用進其他結構內使用,也誠如《The Swift Programming Language》中文版所述:
建構器init(center:size:)
可以自己將origin
和size
的新值賦值到對應的屬性中。然而盡量利用現有的建構器和它所提供的功能來實作init(center:size:)
的功能,是更方便、更清晰和更直觀的方法。
參考型別的作法,則有些許不同,以下,將以類型作為例子,描述其繼承與建構之過程:
類別的建構器:指定建構器、便利建構器
類別裡面的所有儲存型屬性 — 包括所有繼承自父類別的屬性 — 都必須在建構過程中設置初始值。
意思是,類別在一開始的建構過程就應該賦值,無論是初始值或啥鬼
Swift 提供了兩種型別的類別建構器來確保所有類別實例中儲存型屬性都能獲得初始值,它們分別是指定建構器和便利建構器。
以下會針對兩者稍微進行描述:
每一個類別都必須擁有至少一個指定建構器。在某些情況下,許多類別通過繼承了父類別中的指定建構器而滿足了這個條件。
便利建構器是類別中比較次要的、輔助型的建構器。你可以定義便利建構器來呼叫同一個類別中的指定建構器,並為其參數提供預設值。你也可以定義便利建構器來創建一個特殊用途或特定輸入的實例。
也就是說,指定建構器是類別語法中預設的,而大多時候,我們在使用繼承這個功能的時候,也一併會將父類別的建構器一併繼承下來,而便利建構器,跟指定建構器比起來,則沒那麼主要,屬於另有用途的時候,才採取的建構器。
因此,《The Swift Programming Language》中文版指出:
你應當只在必要的時候為類別提供便利建構器,比方說某種情況下通過使用便利建構器來快捷呼叫某個指定建構器,能夠節省更多開發時間並讓類別的建構過程更清、晰明
而以下是指定建構器的語法:

以下為便利建構器的語法:

至此,我們可以先暸解到在類型運作建構器的過程,相較值型別的結構來說,是較為複雜的內容,本篇先將指定建構器、便利建構器作為一開始的運作的初探,下一篇,將對類型中的指定建構器、便利建構器運作之原理、意義,並從解釋從實作。