1、Swift中,繼承只能發(fā)生在類上,一個類可以繼承另一個類的方法、屬性、下標等特征。
class 子類:父類 {}
override init() 可以重寫父類構造函數
Swift中,類的繼承只能是單繼承,多重繼承可以通過遵從協議實現,一個類只能集成一個父類,但是可以遵從多個協議
2、構造函數繼承
向上代理:繼承時,在子類構造過程中,要先調用父類構造函數,初始化父類的存儲屬性。指定構造函數
3、Swift限制構造函數之間代理調用的規(guī)則:
①指定構造函數,必須調用其直接父類的指定構造函數
②便利構造函數,必須調用同一類中定義的其他構造函數
③便利構造函數,必須最終以調用一個指定構造函數結束
4、構造過程兩個階段:
階段一:分配內存→初始化子類存儲屬性→初始化父類存儲屬性→初始化全部的父類存儲屬性
第一階段構造完成的標志:super.init或者self.init
階段二:對每個類進行進一步修改存儲屬性、調用實例方法等處理
構造過程安全檢查:
①指定構造函數必須保存其所在類的所有存儲屬性都完成初始化,才能向上調用父類構造函數代理
②指定構造函數必須先向上調用父類構造函數代理,然后再為繼承的屬性設置新值,否則新值將被父類中的構造函數所覆蓋
③便利構造函數必須先調用同一類中的其他構造函數代理,然后再為任意屬性賦值,否則新值將被同一類中其他指定構造函數覆蓋
④構造函數在第一階段構造完成之前,不能調用實例方法,也不能讀取實例屬性
5、構造函數繼承
條件1:子類沒有定義任何指定構造函數,則自動繼承父類的所有指定構造函數
條件2:如果子類提供了所有父類指定構造函數的實現,無論是通過條件1擊沉改過來的,還是通過自己編寫的,都自動繼承父類所有的便利構造函數
6、繼承后的重寫
①重寫實例屬性
可以重寫Getter、Setter訪問器,可以重寫屬性觀察者;子類繼承父類時,可以通過Getter、Setter訪問器,重寫父類的存儲屬性和計算屬性。
屬性的重寫,看出:子類本身并不存儲數據,數據存儲在父類的存儲屬性中
一個屬性重寫了觀察者(willSet,didSet)之后,就不能再重寫Getter、Setter,常量屬性、只讀計算屬性不能重寫觀察者
②重寫靜態(tài)屬性
class屬性的可以被重寫,static屬性的不能被重寫
③重寫實例方法
override 父類方法 {}
④重寫靜態(tài)方法
class屬性的可以被重寫,static屬性的不能被重寫
靜態(tài)方法中,不能訪問實例屬性
⑤下標重寫
重寫下標的get、set
7、final關鍵字
final class ,final聲明的類,不能被繼承,final聲明的屬性、方法、下標,不能被重寫
8、類型檢查與轉換(父類類型轉換成為子類類型,向下轉型;子類類型轉換為父類類型,向上轉型)
is : 判斷一個實例是否是某個類的類型
as:僅僅應用于向上轉型 ?let a : Student = Student() ?let b : Person = a as b
as!:對可選值拆包,將非可選類型轉換為可選類型,將可選類型轉換為非可選類型,如果不能轉換為目標類型,會出現運行時錯誤
as?:不進行拆包,將非可選類型轉換為可選類型,將可選類型轉換為可選類型,如果不能轉換為目標地類型,則值為nil
as?是在不確定類型轉換是否成功的情況下使用,如果成功轉換,結果是可選類型;如果能確保轉換一定成功,可以使用as!在轉換的同時進行隱式拆包
9、不確定類型
AnyObject:任何類的類型
Any:任何類型,包括類和其他數據類型