Swift學習筆記系列 (13)初始化

2021-07-04 07:57:10 字數 2949 閱讀 9907

tags: swift 學習筆記

目標:類、結構體和列舉

目的:例項使用前的準備,儲存屬性賦值以及其他必要操作

類和結構體的儲存屬性在使用前必須要有初始值,提供初始值可以通過定義時指定,也可以通過構造方法賦值。

初始化過程中給儲存屬性賦值,不會觸發觀察者行為。

通過構造方法的引數給必須要有值的儲存屬性賦值、給可選型別屬性賦值;

初始化過程中給常量屬性賦值;

構造方法的引數語法和函式以及方法的相同。

在初始化階段中的任意時刻,都可以給常量屬性賦值,但是一旦賦值就不能修改了。

如果結構體和類中所有的屬性都有預設值了,儘管沒有明確宣告,但實際上已經有了乙個不需要引數的預設構造方法。

即使沒有給全部屬性度提供預設值,結構體仍會自動獲得乙個構造方法(memberwise initializers)。

這個構造方法以結構體成員名字作引數,會給其中的成員賦值。

構造方法可以呼叫其它構造方法來實現乙個例項初始化的一部分。這個過程,叫做構造方法**(initializer delegation),這樣做避免了在多個構造方法中出現重複**。

構造方法**的工作規則和什麼形式的**是被允許的,這些對於值型別和類型別而言是不相同的。

對於值型別,採用selft.init引用其他構造方法即可。

需要注意如果值型別定義了構造方法,就不能再訪問它的預設構造方法了(或者memberwise initializers,當值型別是結構體的時候)。這是為了避免意外使用預設構造方法,而沒有使用提供了必要操作的稍微複雜的自定義構造方法。

對於值型別,如果想在自定義的構造方法中引用自動獲得的構造方法,那麼把自定義構造方法寫在擴充套件中。

繼承是類的特有行為,類的初始化要保證類的所有屬性都被賦值,不論是繼承來的還是自身定義的。

類的初始化通過兩種構造方法實現:指定構造方法和方便構造方法

必須要有,可以有多個,但一般是乙個,是繼承鏈上的一部分,子類的指定構造方法會呼叫超類的構造方法。

不是必須的,必須要引用同乙個類的指定構造方法,可以有多個。定義的時候需要用關鍵字「convenience 」特別強調。

指定構造方法必須呼叫它的直接超類的乙個指定構造方法。

方便方法必須呼叫同乙個類的另外乙個構造方法。

方便方法必須最終呼叫到乙個指定構造方法。

指定構造方法總是被委託方;

方便構造方法總是委託方。

這部分主要要說明類的初始化順序。

順序是這樣的:

第二階段開始才可以訪問例項方法和self。

子類不預設繼承超類的構造方法。

子類用override關鍵字定義重寫的構造方法。

根據類構造方法引用的規則,子類不可能重寫超類的方便構造方法,只能重寫超類的指定構造方法。

子類新加的屬性都有預設值的前提下:

如果子類沒有定義任何指定構造方法,則預設繼承超類的指定構造方法。

如果子類有超類所有指定構造方法的實現,無論是通過繼承還是通過重寫,那麼子類會預設繼承超類的全部方便構造方法。

init?

不能定義擁有相同引數型別和名稱的可以失敗的和不可失敗的構造方法。

enum temperatureunit }}

獲得條件:列舉成員有原始值

形式:init?(rawvalue:)

值型別的可失敗構造方法可以在構造方法的任意時刻出發構造失敗,但是對於類就不行了。類的構造方法要出發構造失敗,需要在自身的所有儲存屬性被賦值了初始值而且呼叫了其他構造方法之後才能進行。

可以失敗構造方法的傳遞

可以失敗構造方法可以呼叫不可失敗構造方法,但這樣會導致構造結果的不確定性。

不可失敗構造方法不可以呼叫可以失敗構造方法。因為這樣構造結果的確定性就未知了。

繼承鏈上的構造方法失敗後,後續初始化操作不再繼續執行。

重寫可以失敗的構造方法

可失敗的構造方法可以被重寫為不可失敗的構造方法,但不能再引用超類的可失敗構造方法了。

不可失敗的構造方法不可以被重寫為可失敗的構造方法。

init!可失敗構造方法

init!和init?可以相互呼叫,相互重寫。

required修飾符標記的構造方法叫必須構造方法,所有子類必須要有。

必須構造方法有傳遞性,子類的子類也要有。

通過繼承就獲得了的,不必提供實現。

重寫了乙個必須構造方法,不必用override關鍵字,只用required關鍵字就行了。

可以用閉包和函式給屬性設定預設值

用閉包給屬性設定值的時候要注意,此時初始化尚未完成,不能訪問例項屬性和self。

分類依據

名稱標記和說明

是否在繼承鏈上

指定構造方法

方便構造方法

convenience

是否構造成功

不可失敗構造方法

可失敗構造方法

init?或者init!

子類是否構一定要實現

一般構造方法

必須構造方法

required

子類是否構重寫

一般構造方法

重寫構造方法

override

自動獲得的構造方法

類和結構體的無引數構造方法

條件:屬性都有預設值而且沒有定義構造方法

結構體的初始化成員構造方法

條件:沒有定義構造方法

列舉自動獲得的可失敗構造方法

init?(rawvalue:)

類自動繼承的指定構造方法

條件:新加屬性有預設值而且沒有定義指定構造方法

類自動繼承超類所有方便構造方法

條件:新加屬性有預設值而且有超類所有的指定構造方法實現

swift 學習筆記 13 for迴圈

for 迴圈 示例 for i in 0.10 通過 忽略遍歷的值,可以沒有變數,用 代替 for in 0.10 陣列遍歷 遍歷陣列 var names name0 name1 name2 name3 for name in names 有時遍歷陣列的時候,需要知道是第幾個元素,通過這個方法 na...

Swift學習筆記 初始化

swift為結構體提供了預設初始化方法,當結構體所有屬性都有預設值時,可以使用空白初始化方法 struct person var person person 成員初始化方法是預設初始化方法的另外一種形式,注意常量屬性如果有預設值則不能使用初始化方法,因為常量只能初始化一次 struct person...

Swift學習筆記系列 (16)可選鏈

tags swift 學習筆記 可選鏈提供的是一種方便訪問可選型別值的途徑。可選鏈可以替代強制拆包的寫法,而且寫法可以更簡潔。可選鏈可以多級,直達你想要訪問的內容。可選鏈可以方法屬性 下標和方法。可選鏈返回的必定是乙個可選型別,返回nil則證明這條可選鏈中的某個環節是斷掉 其中有nil 的。用法 簡...