1、Swift中,繼承只能發(fā)生在類上惕它,一個(gè)類可以繼承另一個(gè)類的方法、屬性废登、下標(biāo)等特征淹魄。
class 子類:父類 {}
override init() 可以重寫父類構(gòu)造函數(shù)
Swift中,類的繼承只能是單繼承钳宪,多重繼承可以通過(guò)遵從協(xié)議實(shí)現(xiàn)揭北,一個(gè)類只能集成一個(gè)父類扳炬,但是可以遵從多個(gè)協(xié)議
2、構(gòu)造函數(shù)繼承
向上代理:繼承時(shí)搔体,在子類構(gòu)造過(guò)程中恨樟,要先調(diào)用父類構(gòu)造函數(shù),初始化父類的存儲(chǔ)屬性疚俱。指定構(gòu)造函數(shù)
3劝术、Swift限制構(gòu)造函數(shù)之間代理調(diào)用的規(guī)則:
①指定構(gòu)造函數(shù),必須調(diào)用其直接父類的指定構(gòu)造函數(shù)
②便利構(gòu)造函數(shù)呆奕,必須調(diào)用同一類中定義的其他構(gòu)造函數(shù)
③便利構(gòu)造函數(shù)养晋,必須最終以調(diào)用一個(gè)指定構(gòu)造函數(shù)結(jié)束
4、構(gòu)造過(guò)程兩個(gè)階段:
階段一:分配內(nèi)存→初始化子類存儲(chǔ)屬性→初始化父類存儲(chǔ)屬性→初始化全部的父類存儲(chǔ)屬性
第一階段構(gòu)造完成的標(biāo)志:super.init或者self.init
階段二:對(duì)每個(gè)類進(jìn)行進(jìn)一步修改存儲(chǔ)屬性梁钾、調(diào)用實(shí)例方法等處理
構(gòu)造過(guò)程安全檢查:
①指定構(gòu)造函數(shù)必須保存其所在類的所有存儲(chǔ)屬性都完成初始化绳泉,才能向上調(diào)用父類構(gòu)造函數(shù)代理
②指定構(gòu)造函數(shù)必須先向上調(diào)用父類構(gòu)造函數(shù)代理,然后再為繼承的屬性設(shè)置新值姆泻,否則新值將被父類中的構(gòu)造函數(shù)所覆蓋
③便利構(gòu)造函數(shù)必須先調(diào)用同一類中的其他構(gòu)造函數(shù)代理零酪,然后再為任意屬性賦值,否則新值將被同一類中其他指定構(gòu)造函數(shù)覆蓋
④構(gòu)造函數(shù)在第一階段構(gòu)造完成之前拇勃,不能調(diào)用實(shí)例方法四苇,也不能讀取實(shí)例屬性
5、構(gòu)造函數(shù)繼承
條件1:子類沒(méi)有定義任何指定構(gòu)造函數(shù)方咆,則自動(dòng)繼承父類的所有指定構(gòu)造函數(shù)
條件2:如果子類提供了所有父類指定構(gòu)造函數(shù)的實(shí)現(xiàn)月腋,無(wú)論是通過(guò)條件1擊沉改過(guò)來(lái)的,還是通過(guò)自己編寫的瓣赂,都自動(dòng)繼承父類所有的便利構(gòu)造函數(shù)
6榆骚、繼承后的重寫
①重寫實(shí)例屬性
可以重寫Getter、Setter訪問(wèn)器钩述,可以重寫屬性觀察者寨躁;子類繼承父類時(shí),可以通過(guò)Getter牙勘、Setter訪問(wèn)器职恳,重寫父類的存儲(chǔ)屬性和計(jì)算屬性。
屬性的重寫方面,看出:子類本身并不存儲(chǔ)數(shù)據(jù)放钦,數(shù)據(jù)存儲(chǔ)在父類的存儲(chǔ)屬性中
一個(gè)屬性重寫了觀察者(willSet,didSet)之后恭金,就不能再重寫Getter操禀、Setter,常量屬性横腿、只讀計(jì)算屬性不能重寫觀察者
②重寫靜態(tài)屬性
class屬性的可以被重寫颓屑,static屬性的不能被重寫
③重寫實(shí)例方法
override 父類方法 {}
④重寫靜態(tài)方法
class屬性的可以被重寫斤寂,static屬性的不能被重寫
靜態(tài)方法中,不能訪問(wèn)實(shí)例屬性
⑤下標(biāo)重寫
重寫下標(biāo)的get揪惦、set
7遍搞、final關(guān)鍵字
final class ,final聲明的類器腋,不能被繼承溪猿,final聲明的屬性、方法纫塌、下標(biāo)诊县,不能被重寫
8、類型檢查與轉(zhuǎn)換(父類類型轉(zhuǎn)換成為子類類型措左,向下轉(zhuǎn)型依痊;子類類型轉(zhuǎn)換為父類類型,向上轉(zhuǎn)型)
is : 判斷一個(gè)實(shí)例是否是某個(gè)類的類型
as:僅僅應(yīng)用于向上轉(zhuǎn)型 ?let a : Student = Student() ?let b : Person = a as b
as!:對(duì)可選值拆包媳荒,將非可選類型轉(zhuǎn)換為可選類型抗悍,將可選類型轉(zhuǎn)換為非可選類型,如果不能轉(zhuǎn)換為目標(biāo)類型钳枕,會(huì)出現(xiàn)運(yùn)行時(shí)錯(cuò)誤
as?:不進(jìn)行拆包,將非可選類型轉(zhuǎn)換為可選類型赏壹,將可選類型轉(zhuǎn)換為可選類型鱼炒,如果不能轉(zhuǎn)換為目標(biāo)地類型,則值為nil
as?是在不確定類型轉(zhuǎn)換是否成功的情況下使用蝌借,如果成功轉(zhuǎn)換昔瞧,結(jié)果是可選類型;如果能確保轉(zhuǎn)換一定成功菩佑,可以使用as!在轉(zhuǎn)換的同時(shí)進(jìn)行隱式拆包
9自晰、不確定類型
AnyObject:任何類的類型
Any:任何類型,包括類和其他數(shù)據(jù)類型