Swift 學習筆記 3 類 過載和構造器

2021-07-25 23:56:12 字數 2046 閱讀 7282

可使用 override 修飾

被重寫的方法

父類的屬性(儲存、計算屬性均可override)

屬性觀察者

父類的下標

final 關鍵字

用final 防止重寫,final關鍵字可以修飾類、屬性、方法和下標。

final 不可以修飾方法中的區域性變數,也不能修飾全域性變數。

在類中使用 static修飾類的方法、屬性,表示不可被重寫,相當於 class + final 的效果

init

(形參){}

指定構造器定義: 乙個或者多個初始化所有例項屬性,可呼叫父類的構造器,然後初始化本類的儲存屬性

便利構造器定義: 次要的、輔助行的構造器,通過呼叫同乙個類的其他構造器(可以是指定、也可是便利,但最原始的一定指定構造器)完成初始化, 用convenience 修飾。

指定構造器必須呼叫直接父類的指定構造器

便利構造器必須呼叫同乙個類的其他構造器

便利構造器呼叫的構造器最終節點必須是指定構造器: 便利構造器-… - 指定構造器 (…表示本類的任何構造器)

swift類的構造要兩個階段完成

第一階段: 為儲存屬性分配內容,使用本類構造器初始化由本類定義的儲存屬性

呼叫子類構造器

分配記憶體

指定構造器確保子類定義的所有例項儲存均已賦值

指定構造器呼叫父類的構造器,完成父類定義的例項儲存屬性

沿著繼承樹往上重複4步驟。

第二階段: 從最頂層父類開始,沿著頂部構造器鏈往下,每個構造器都可再次修改儲存屬性。

沿著繼承樹下,構造器鏈中指定構造器有機會進一步定製例項,修改例項屬性、訪問self、呼叫例項方法

重複1步驟,所有的便利構造器都有機會定製例項,使用self。

這個流程解決的問題

過程安全

每乙個類層次都獲得完全的控制權

防止屬性初始化之前被訪問

防止屬性被另乙個構造器意外賦予不同的值

swift內部檢查

指定構造器必須先初始化自己類的例項儲存屬性,才能向上呼叫父類構造器

指定構造器必須向上呼叫父類構造器,才能得到繼承下來的屬性,然後才能賦值。 順序不對會導致剛賦值但是被構造器覆蓋掉了。

便利構造器先呼叫同類的其他(指定)構造器,才能對屬性賦值。 和2檢查原因一樣,擔心賦值被覆蓋

構造器在第一階段完成前,不能呼叫例項方法,不能讀取例項屬性。 (實際上是對第二階段的進一步解釋)

我對構造器的理解:

1. 指定構造器:最原始可以完成初始化的方法

2. 便利構造器:在指定構造器基礎上方便定製化的一些方法,最終還是依賴指定構造器。

這樣可以方便理解構造器鏈。

構造階段,基本原則

1.  準確性(賦值了就一定得到賦值的操作結果,無二義性)

2. 順應類繼承關係。

3. 如果乙個物件沒有初始化,對它屬性操作就是非法的。

結合第一階段和第二階段構造,再參考內部檢查就容易理解了

如果沒提供任何指定構造器,則自動繼承父類所有指定構造器

如果子類實現了父類所有的指定構造器,無論是規則1繼承的,還是自己寫的,都將自動繼承父類所有的便利構造器

四種情況

子類指定 <- 父類指定 y

子類指定 <- 父類便利 n 子類是不會呼叫父類的便利構造器的

子類便利 <- 父類指定 y

子類便利 <- 父類便利 n 子類是不會呼叫父類便利構造器的

結論:

父類便利構造器是不能過載的,因為違背了子類智慧型呼叫父類指定構造器的。

父類指定構造器可以被過載為子類便利構造器和子類指定構造器。

可能失敗的構造器

可能失敗的構造器的傳播

普通構造器不能呼叫同乙個型別的可能失敗的構造器

子類必須包含的構造器

定義:申明所有子類必須包含該require構造器(指定和便利均可),表示為 require init() {}

析構器deinit 方法,沒有返回值,沒有引數,所以不能過載

deinit swift 會自己呼叫父類的deinit方法

析構 Swift學習筆記(十八)

注 本文為自己學習the swift programming language的筆記,其中的例子為引用原書和其他博文或自己原創的。每個例子都會批註一些實踐過程中的經驗或思考總結。1.基礎 析構過程 deinitialization 由析構函式 deinitializer 完成,類的例項在被 資源之前...

Swift 學習筆記 類

存在迴圈引用的問題 class bankcard class user解決迴圈引用 在例項的生命週期中,如果某些時候引用沒有值,那麼弱引用可以避免迴圈強引用。如果引用總是有值,則可以使用無主引用。1.弱引用,使用 weak 修飾 注意弱引用必須被宣告為變數,表明其值能在執行時被修改。弱引用不能被宣告...

swift學習筆記3

任何程式都有順序分支迴圈三種控制語句,其中預設的是順序 分支語句 if 和 switch 迴圈語句 while do。while for for。in 跳轉語句 break continue fallthrough return if結構 表示式 if 條件表示式 if 條件表示式 else if ...