第九節(jié)屬性、方法暑劝、下標(biāo)骆莹、繼承、多態(tài)

一.全局變量

1.內(nèi)存地址的計(jì)算
截屏2020-08-04 上午10.17.20.png

計(jì)算 0xc34f(%rip)的內(nèi)存地 = 下一行的地址(0x100001961 )+ 0xc34f 這里是 16進(jìn)制 = 0x10000DCB0

   class Car {
   //存儲(chǔ)類型屬性担猛,默認(rèn)就是lazy的幕垦,只初始化一次丢氢,底層使用的是 `dispatch_once`方法
    這里的類型屬性(前面加上static) 本質(zhì)就是 全局變量,只不過前面可以加上訪問權(quán)限控制先改,放在堆空間,程序運(yùn)行中會(huì)一直存在卖丸,直到程序結(jié)束才會(huì)釋放。
  public  static var count = 10
    
}

Car.count = 11;

二.方法(Method)

1. 方法類型
  • 實(shí)例方法:枚舉盏道、結(jié)構(gòu)體稍浆、類都可以定義實(shí)例方法
  • 類型方法:通過類型調(diào)用,通過static或是class 關(guān)鍵字定義的方法
struct CarNum {
    
    //類型存儲(chǔ)屬性
    static var num = 10
    
    init(){
        
        CarNum.num = 20
    }
    // 類型方法
    static func getCarNum() -> Int{
        
        print(CarNum.num)
        
        return num
        
    }
    
}

//類型 調(diào)用
CarNum.getCarNum()

  • 類型方法 內(nèi)部 只能訪問類型存儲(chǔ)屬性猜嘱,不能訪問實(shí)例屬性衅枫。

  • 在實(shí)例方法中 self 代表了 調(diào)用的實(shí)例

  • 在類型方法中self代表 類型,print(CarNum.num) = print(self.num) = print(CarNum.self.num)

2.mutating關(guān)鍵字

  • 結(jié)構(gòu)體跟枚舉都是值類型朗伶,默認(rèn)情況下 值類型的屬性弦撩,不能被自身的實(shí)例方法修改
    截屏2020-08-04 上午11.00.54.png

    會(huì)報(bào)錯(cuò),
    如果自身的實(shí)例方法 想要修改實(shí)例屬性论皆,則要在方法前面加上關(guān)鍵字mutating, 如果是類class 則沒有這個(gè)問題益楼。
截屏2020-08-04 上午11.04.43.png
  • 上面枚舉 是一個(gè)狀態(tài)開關(guān)。三個(gè)狀態(tài)循環(huán)取值

3. 關(guān)鍵字: @discardableResult

*在func 前面加上@discardableResult 可以消除 函數(shù)調(diào)用后返回值未被使用的警告??

截屏2020-08-04 上午11.08.34.png

截屏2020-08-04 上午11.10.26.png

三. 下標(biāo)(subscript)

  • 上標(biāo)在右上角顯示的數(shù)字 下標(biāo) 在右下角顯示的數(shù)字 点晴,但是在swift 中這里是指 下標(biāo)功能
  • subcript 的語法類似于實(shí)例方法感凤,計(jì)算屬性,本質(zhì)就是方法粒督∨愀停可以用subscript 給任意類型(類、結(jié)構(gòu)體屠橄、枚舉)添加下標(biāo)功能
截屏2020-08-04 上午11.22.29.png

給類型 添加 類似于數(shù)組訪問的功能族跛。這里p[0] = 11.1 : 會(huì)調(diào)用set方法,0 賦值給index锐墙,11.1賦值給newValue

  • 返回值 double 決定 get方法返回的類型礁哄,決定set方法中 賦值的類型(newValue)也是double。
  • subscript 可以接受多個(gè)參數(shù)溪北,并且類型任意桐绒。
  • subscript 可以沒有set 方法,但是必須要有g(shù)et方法 跟計(jì)算屬性很像刻盐。


    截屏2020-08-04 上午11.29.45.png
  • 可以在參數(shù)前面 添加參數(shù)標(biāo)簽
  • 下標(biāo)可以是類型方法掏膏,就是前面加上關(guān)鍵字 static或是 class


    截屏2020-08-04 上午11.36.57.png
  • 類型方法 直接通過類型傳遞

當(dāng)類或者結(jié)構(gòu)體 作為下標(biāo)返回值的注意點(diǎn)

1.當(dāng)返回的是 結(jié)構(gòu)體類型時(shí)候
截屏2020-08-04 上午11.42.23.png
  • 這里下標(biāo)是支持這樣樣寫的劳翰。
  • 這里 pm[0].x = 11 等價(jià)于 Point(x:11,y:pm[0].y)
2.當(dāng)返回的是 類 時(shí)候
  • 截屏2020-08-04 上午11.48.22.png
  • pm[0] 本質(zhì)返回的是 指針對(duì)象敦锌,是可以直接訪問和修改 內(nèi)部的成員變量的。

接受多個(gè)參數(shù)的下標(biāo)

截屏2020-08-04 上午11.52.36.png

四. 繼承

1.在swift中 值類型的(枚舉佳簸、結(jié)構(gòu)體)不支持 繼承乙墙,只有類支持繼承
  • 沒有父類的類成為 :基類
  • swift 沒有像OC 跟Java一樣規(guī)定 任何類都要繼承自某個(gè)基類
  • 子類可以重寫父類的下標(biāo)颖变、方法、屬性听想,重寫 必須在前面加上override關(guān)鍵字

2.內(nèi)存結(jié)構(gòu)

  • 內(nèi)存占用
class Dog {

// 前面有 8 個(gè)字節(jié) 存放 指向類型相關(guān)信息腥刹,8個(gè)記錄引用計(jì)數(shù)相關(guān)
   var age = 0  //8個(gè)字節(jié)
}
總共占用24個(gè)字節(jié),但是必須是 16的倍數(shù)汉买,最后為32字節(jié)
var animus = Dog()
animus.age = 10  //內(nèi)存在堆空間衔峰,占用字節(jié)是 16的倍數(shù)。

print(Mems.size(ofRef:anmus)) //32字節(jié)

繼承的內(nèi)存占用情況總結(jié):


截屏2020-08-04 下午2.48.51.png

3.重寫 實(shí)例方法跟下標(biāo)

class Amintion {
    
    func speak() {
        
        print("anmiation Speak")
        
    }
    
    subscript(index : Int) -> Int{
        
        print("\(index)")
        return index
    }
}

var am = Amintion()

//am.speak()
//
//am[10]

class Dog: Amintion {
    
    //重寫父類方法
    override func speak() {
        
        super.speak()
        
    }
    //重寫 下標(biāo)方法
    override subscript(index: Int) -> Int {
        //調(diào)用父類的的下標(biāo) 實(shí)現(xiàn)
        return super[index] + 1
    }
    
}

//父類類型 指向子類對(duì)象蛙粘,就是多態(tài)
am = Dog()

4.重寫類型方法跟下標(biāo)

  • 被 class 修飾的類型方法垫卤、下標(biāo) 允許被子類重寫

  • 被 static 修飾的類型方法、下標(biāo)不允許被子類重寫


    截屏2020-08-04 下午3.26.19.png
  • 父類使用 class 修飾的類型方法出牧,子類是可以使用 static來修飾類型方法的穴肘。

5.重寫實(shí)例屬性

  • 子類可以將父類的屬性(存儲(chǔ)或者計(jì)算屬性)重寫為計(jì)算屬性 并且只能重寫為計(jì)算屬性

    截屏2020-08-04 下午3.39.17.png

    重寫后:
    截屏2020-08-04 下午3.47.50.png

  • super.radius相當(dāng)于訪問父類里面的存儲(chǔ)屬性

  • get 方法 里面super.radius相當(dāng)于返回父類的radius

  • super.diameter =相當(dāng)于調(diào)用 父類里面的 set方法

  • super.diameter 相當(dāng)于調(diào)用父類里面的get方法
    打印結(jié)構(gòu):

    截屏2020-08-04 下午3.57.47.png

注意:如果子類的get方法里面訪問radius 不加上super 則會(huì)產(chǎn)生死循環(huán)。這里一定要加上 super關(guān)鍵字進(jìn)行訪問父類的 radius

6.重寫屬性的注意點(diǎn):

  • 子類可以將父類的屬性(存儲(chǔ)或者計(jì)算屬性)重寫為計(jì)算屬性 并且只能重寫為計(jì)算屬性
  • 子類不可以將父類的屬性重寫為存儲(chǔ)屬性
  • 只能重寫 var 屬性舔痕,不能重寫 let 屬性
  • 重寫時(shí) 屬性名稱 類型要一致
  • 子類沖洗后的屬性權(quán)限评抚,不能小于父類的屬性權(quán)限,也就是 get 伯复、set 方法的有無


    截屏2020-08-04 下午4.10.48.png

7.重寫類型屬性

截屏2020-08-04 下午4.14.29.png

8.屬性觀察器

  • 可以在子類中為父類屬性(出了只讀計(jì)算屬性慨代、let屬性)添加屬性觀察器


    截屏2020-08-04 下午4.19.47.png
  • 子類里面可以給父類的(實(shí)例或者類型)計(jì)算屬性 增加屬性觀察器,除了let跟只讀計(jì)算屬性啸如。
    截屏2020-08-04 下午4.50.21.png

注意: 訪問 radius 永遠(yuǎn)返貨的是 radius鱼响,并且 在最后一句打印時(shí)候,會(huì)先調(diào)用 get radius组底。第一句的打印 是因?yàn)橐@取 oldValue 的值 打印的 Circle getRadius丈积。

9.final 關(guān)鍵字

  • 被final修飾的 方法、屬性债鸡、下標(biāo)禁止被重寫
  • 被final修飾的類 禁止被繼承

swift 多態(tài)的實(shí)現(xiàn)原理

  • 定義: 父類指針 指向子類對(duì)象 又調(diào)用子類方法江滨,就叫多態(tài)
  • OC 多態(tài)的實(shí)現(xiàn)原理 :Runtime
  • C++ 多態(tài):虛表(虛函數(shù)表)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市厌均,隨后出現(xiàn)的幾起案子唬滑,更是在濱河造成了極大的恐慌,老刑警劉巖棺弊,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晶密,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡模她,警方通過查閱死者的電腦和手機(jī)稻艰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侈净,“玉大人尊勿,你說我怎么就攤上這事僧凤。” “怎么了元扔?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵躯保,是天一觀的道長。 經(jīng)常有香客問我澎语,道長途事,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任擅羞,我火速辦了婚禮盯孙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祟滴。我一直安慰自己振惰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布垄懂。 她就那樣靜靜地躺著骑晶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪草慧。 梳的紋絲不亂的頭發(fā)上桶蛔,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音漫谷,去河邊找鬼仔雷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舔示,可吹牛的內(nèi)容都是我干的碟婆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惕稻,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼竖共!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起俺祠,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤公给,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蜘渣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淌铐,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年蔫缸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腿准。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捂龄,死狀恐怖释涛,靈堂內(nèi)的尸體忽然破棺而出加叁,到底是詐尸還是另有隱情倦沧,我是刑警寧澤唇撬,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站展融,受9級(jí)特大地震影響窖认,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜告希,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一扑浸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧燕偶,春花似錦喝噪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伯诬,卻和暖如春晚唇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盗似。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工哩陕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赫舒。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓悍及,卻偏偏與公主長得像,于是被迫代替她去往敵國和親接癌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子并鸵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容