最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift繼承Inheritance淺析介紹

 更新時(shí)間:2022年08月24日 10:37:29   作者:撲騰的蛾子  
繼承我們可以理解為一個(gè)類獲取了另外一個(gè)類的方法和屬性。當(dāng)一個(gè)類繼承其它類時(shí),繼承類叫子類,被繼承類叫超類(或父類),在Swift中,類可以調(diào)用和訪問(wèn)超類的方法,屬性和下標(biāo)腳本,并且可以重寫(xiě)它們。我們也可以為類中繼承來(lái)的屬性添加屬性觀察器

繼承(Inheritance)

1、值類型(枚舉、結(jié)構(gòu)體)不支持繼承,只有類支持繼承

2、沒(méi)有父類的類,稱為:基類

Swift并沒(méi)有像OC、Java那樣的規(guī)定:任何類最終都要繼承自某個(gè)基類。

3、子類可以重寫(xiě)父類的下標(biāo)、方法、屬性,重寫(xiě)必須加上override關(guān)鍵字。

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

class Animal {
    var age = 0
}
class Dog : Animal {
    var weight = 0
}
class ErHa : Dog {
    var iq = 0
}
let a = Animal()
a.age = 10

看一下a需要多少內(nèi)存,a是堆空間的,所以必然是16的倍數(shù),最前面有8個(gè)字節(jié)拿來(lái)放類型信息,第二個(gè)8個(gè)字節(jié)放引用計(jì)數(shù)相關(guān)的東西,再往后8個(gè)字節(jié)才是放age,總共用到的是24個(gè)字節(jié),但是需要保證是16的倍數(shù),所以是32個(gè)字節(jié)。

Dog因?yàn)橛欣^承,所以等價(jià)于

class Animal {
    var age = 0
}
class Dog : Animal {
    var weight = 0
}
class Dog {
    var age = 0
    var weight = 0
}
class ErHa : Dog {
    var iq = 0
}
let d = Dog()
d.age = 10
d.weight = 20

d對(duì)象里面有兩個(gè)屬性,age和weight,各占8個(gè)字節(jié),并且一般來(lái)說(shuō)父類的屬性內(nèi)存靠前,d對(duì)象也占用32個(gè)字節(jié),第一塊是類型相關(guān)的8個(gè)字節(jié),第二塊是引用計(jì)數(shù)相關(guān)的8個(gè)字節(jié),第三塊是存儲(chǔ)age的8個(gè)字節(jié),第四塊是存儲(chǔ)weight的8個(gè)字節(jié)。

同樣的一個(gè)ErHa對(duì)象要有24個(gè)字節(jié)存儲(chǔ)age、weight、iq,另外還有前面的16個(gè)字節(jié),所以是40個(gè)字節(jié),但是要保證是16的倍數(shù),所以就是48。

重寫(xiě)實(shí)例方法、下標(biāo)

class Animal {
    func speak() {
        print("Animal speak")
    }
    subscript(index: Int) -> Int {
        return index
    }
}
class Cat : Animal {
    override func speak() {
        super.speak()
        print("Cat speak")
    }
    override subscript(index: Int) -> Int {
        return super[index] + 1
    }
}
var anim: Animal
anim = Animal()
//Animal speak
anim.speak()
//6
print(anim[6])
anim = Cat()
//Animal speak
//Cat speak
anim.speak()
// 7
print(anim[6])

重寫(xiě)類型方法、下標(biāo)

1、被class修飾的類型方法、下標(biāo),允許被子類重寫(xiě)

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

class Animal {
    class func speak() {
        print("Animal speak")
    }
    class subscript(index: Int) -> Int {
        return index
    }
}
class Cat : Animal {
    override class func speak() {
        super.speak()
        print("Cat speak")
    }
    override class subscript(index: Int) -> Int {
        return super[index] + 1
    }
}

static修飾的類型方法、下標(biāo)重寫(xiě)報(bào)錯(cuò)

子類重寫(xiě)可以用static修飾,只不過(guò)不能再繼續(xù)被重寫(xiě)了

重寫(xiě)屬性

1、子類可以將父類的屬性(存儲(chǔ)、計(jì)算)重寫(xiě)為計(jì)算屬性

2、子類不可以將父類屬性重寫(xiě)為存儲(chǔ)屬性

3、只能重寫(xiě)var屬性,不能重寫(xiě)let屬性

4、重寫(xiě)時(shí),屬性名、類型要一致

5、子類重寫(xiě)后的屬性權(quán)限,不能小于父類屬性的權(quán)限

如果父類屬性是只讀的,那么子類重寫(xiě)后的屬性可以是只讀的,也可以是可讀寫(xiě)的。

如果父類屬性是可讀寫(xiě)的,那么子類重寫(xiě)后的屬性也必須是可讀寫(xiě)的。

重寫(xiě)實(shí)例屬性

class Circle {
    var radius: Int = 0
    var diameter: Int {
        set {
            print("Circle setDiameter")
            radius = newValue / 2
        }
        get {
            print("Circle getDiameter")
            return radius * 2
        }
    }
}
class SubCircle: Circle {
    override var radius: Int {
        set {
            print("SubCircle setRadius")
            super.radius = newValue > 0 ? newValue : 0
        }
        get {
            print("SubCircle getRadius")
            return super.radius
        }
    }
    override var diameter: Int {
        set {
            print("SubCircle setDiameter")
            super.diameter = newValue > 0 ? newValue : 0
        }
        get {
            print("SubCircle getDiameter")
            return super.diameter
        }
    }
}
var circle = SubCircle()
circle.radius = 6
//SubCircle setRadius
print(circle.diameter)
//SubCircle getDiameter
//Circle getDiameter
//SubCircle getRadius
//12
circle.diameter = 20
//SubCircle setDiameter
//Circle setDiameter
//SubCircle setRadius
print(circle.radius)
//SubCircle getRadius
//10

重寫(xiě)類型屬性

1、被class修飾的計(jì)算類型屬性,可以被子類重寫(xiě)

存儲(chǔ)類型屬性只能用static來(lái)修飾。

2、被static修飾的類型屬性(存儲(chǔ)、計(jì)算),不可以被子類重寫(xiě)

屬性觀察器

1、可以在子類中為父類屬性(除了只讀計(jì)算屬性、let屬性)增加屬性觀察器

class Circle {
    var radius: Int = 1
}
class SubCircle: Circle {
    override var radius: Int {
        willSet {
            print("SubCircle willSetRadius", newValue)
        }
        didSet {
            print("SubCircle didSetRadius", oldValue, radius)
        }
    }
}
var circle = SubCircle()
circle.radius = 10
//SubCircle willSetRadius 10
//SubCircle didSetRadius 1 10

2、父類和子類中都有屬性觀察器

class Circle {
    var radius: Int = 1 {
        willSet {
            print("Circle willSetRadius", newValue)
        }
        didSet {
            print("Circle didSetRadius", oldValue, radius)
        }
    }
}
class SubCircle: Circle {
    override var radius: Int {
        willSet {
            print("SubCircle willSetRadius", newValue)
        }
        didSet {
            print("SubCircle didSetRadius", oldValue, radius)
        }
    }
}
var circle = SubCircle()
circle.radius = 10
//SubCircle willSetRadius 10
//Circle willSetRadius 10
//Circle didSetRadius 1 10
//SubCircle didSetRadius 1 10

3、子類是可以給父類中的計(jì)算屬性增加屬性觀察器的。

class Circle {
    class var radius: Int {
        set {
            print("Circle setRadius", newValue)
        }
        get {
            print("Circle getRadius")
            return 20
        }
    }
}
class SubCircle: Circle {
    override static var radius: Int {
        willSet {
            print("SubCircle willSetRadius", newValue)
        }
        didSet {
            print("SubCircle didSetRadius", oldValue, radius)
        }
    }
}
SubCircle.radius = 10
//        Circle getRadius (oldValue)
//        SubCircle willSetRadius 10
//        Circle setRadius 10
//        Circle getRadius (radius)
//        SubCircle didSetRadius 20 20

final

1、被final修飾的方法、下標(biāo)、屬性,禁止被重寫(xiě)

2、被final修飾的類,禁止被繼承

到此這篇關(guān)于Swift繼承Inheritance淺析介紹的文章就介紹到這了,更多相關(guān)Swift繼承內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Swift實(shí)現(xiàn)表格視圖單元格多選

    Swift實(shí)現(xiàn)表格視圖單元格多選

    這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)表格視圖單元格多選,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • swift實(shí)現(xiàn)自動(dòng)輪播圖效果(UIScrollView+UIPageControl+Timer)

    swift實(shí)現(xiàn)自動(dòng)輪播圖效果(UIScrollView+UIPageControl+Timer)

    這篇文章主要為大家詳細(xì)介紹了swift實(shí)現(xiàn)自動(dòng)輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Swift心得筆記之控制流

    Swift心得筆記之控制流

    控制流(Control Flow)我不想這么譯的。。。我更想叫控制語(yǔ)句,但是想想,這么叫也沒(méi)錯(cuò),意指流程控制。大部分用法跟C類似。
    2015-04-04
  • Swift循環(huán)遍歷集合的方法總結(jié)分享

    Swift循環(huán)遍歷集合的方法總結(jié)分享

    SWIFT是蘋(píng)果于2014年WWDC發(fā)布的新開(kāi)發(fā)語(yǔ)言,可與Objective-C*共同運(yùn)行于Mac OS和iOS平臺(tái),用于搭建基于蘋(píng)果平臺(tái)的應(yīng)用程序。這篇文章主要給大家總結(jié)介紹了關(guān)于Swift循環(huán)遍歷集合的方法,如for-in循環(huán)、for循環(huán)以及基于塊的遍歷等方法,需要的朋友可以參考下。
    2017-03-03
  • Swift類和對(duì)象的底層探索分析

    Swift類和對(duì)象的底層探索分析

    這篇文章主要為大家介紹了Swift類和對(duì)象的底層探索分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • SwiftUI學(xué)習(xí)之state和Binding的區(qū)別淺析

    SwiftUI學(xué)習(xí)之state和Binding的區(qū)別淺析

    這篇文章主要給大家介紹了關(guān)于SwiftUI學(xué)習(xí)之state和Binding區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • SwiftUI開(kāi)發(fā)總結(jié)combine原理簡(jiǎn)單示例詳解

    SwiftUI開(kāi)發(fā)總結(jié)combine原理簡(jiǎn)單示例詳解

    這篇文章主要為大家介紹了SwiftUI開(kāi)發(fā)總結(jié)combine原理簡(jiǎn)單示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Swift?指針底層探索分析

    Swift?指針底層探索分析

    這篇文章主要為大家介紹了Swift?指針底層探索分析,主要包括指針的基本使用,以及指針的內(nèi)存綁定進(jìn)行詳細(xì)分析,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Swift縮放并填充圖片功能的實(shí)現(xiàn)

    Swift縮放并填充圖片功能的實(shí)現(xiàn)

    最近有一個(gè)需求,就是將圖片先等比例縮放到指定大小,然后將空余出來(lái)空間填充為黑色,返回指定大小的圖片。本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • 詳解Swift語(yǔ)言的while循環(huán)結(jié)構(gòu)

    詳解Swift語(yǔ)言的while循環(huán)結(jié)構(gòu)

    這篇文章主要介紹了Swift語(yǔ)言的while循環(huán)結(jié)構(gòu),包括do...while循環(huán)的用法,需要的朋友可以參考下
    2015-11-11

最新評(píng)論

彩票| 绥宁县| 万全县| 紫云| 蒲城县| 南澳县| 焉耆| 新竹市| 乌审旗| 德阳市| 淅川县| 祁门县| 新乐市| 延庆县| 湟源县| 曲水县| 微博| 长沙市| 涪陵区| 龙口市| 会东县| 车致| 富顺县| 浑源县| 上虞市| 日喀则市| 大同市| 怀化市| 女性| 漠河县| 襄城县| 纳雍县| 宜川县| 湖南省| 夏邑县| 阿克陶县| 兖州市| 扶绥县| 铜川市| 额济纳旗| 白山市|