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

Swift教程之繼承詳解

 更新時(shí)間:2015年01月12日 15:39:07   投稿:junjie  
這篇文章主要介紹了Swift教程之繼承詳解,一個(gè)類(lèi)可以從另外一個(gè)類(lèi)中繼承方法,屬性或者其它的一些特性,當(dāng)一個(gè)類(lèi)繼承于另外一個(gè)類(lèi)時(shí),這個(gè)繼承的類(lèi)叫子類(lèi),被繼承的類(lèi)叫父類(lèi),需要的朋友可以參考下

一個(gè)類(lèi)可以從另外一個(gè)類(lèi)中繼承方法,屬性或者其它的一些特性。當(dāng)一個(gè)類(lèi)繼承于另外一個(gè)類(lèi)時(shí),這個(gè)繼承的類(lèi)叫子類(lèi),被繼承的類(lèi)叫父類(lèi)。繼承是Swift中類(lèi)區(qū)別于其它類(lèi)型的一個(gè)基本特征。

Swift中的類(lèi)可以調(diào)用父類(lèi)的方法,使用父類(lèi)的屬性和下標(biāo),還可以根據(jù)需要使用重寫(xiě)方法或者屬性來(lái)重新定義和修改他們的一些特性。Swift可以幫助你檢查重寫(xiě)的方法和父類(lèi)的方法定義是相符的。

類(lèi)還可以為它繼承的屬性添加觀(guān)察者,這樣可以能夠讓它在一個(gè)屬性變化的時(shí)候得到通知。屬性觀(guān)察者可以被添加給任何屬性,不管它之前是存儲(chǔ)屬性還是計(jì)算屬性。

1、定義一個(gè)基類(lèi)

任何一個(gè)不繼承于其它類(lèi)的類(lèi)被稱(chēng)作基類(lèi)

注意:Swift的類(lèi)不是從一個(gè)全局基類(lèi)繼承而來(lái)。在你編寫(xiě)代碼的時(shí),只要是在類(lèi)的定義中沒(méi)有繼承自父類(lèi)的類(lèi)都是基類(lèi)。

下面的例子定義了一個(gè)叫Vehicle的基類(lèi)?;?lèi)包含兩個(gè)所有交通工具通用的屬性numberOfWheels和maxPassengers。這兩個(gè)屬性被一個(gè)叫description的方法使用,通過(guò)返回一個(gè)String描述來(lái)作為這個(gè)交通工具的特征:

復(fù)制代碼 代碼如下:

class Vehicle {
    var numberOfWheels: Int
    var maxPassengers: Int
    func description() -> String {
        return "\(numberOfWheels) wheels; up to \(maxPassengers) passengers"
    }
    init() {
        numberOfWheels = 0
        maxPassengers = 1
    }
}

這個(gè)交通工具類(lèi)Vehicle還定義了一個(gè)構(gòu)造函數(shù)來(lái)設(shè)置它的屬性。構(gòu)造函數(shù)更多的解釋在Initialization一章,但是為了說(shuō)明子類(lèi)如何修改繼承的屬性,這里需要簡(jiǎn)要解釋一下什么叫構(gòu)造函數(shù)。

通過(guò)構(gòu)造函數(shù)可以創(chuàng)建一個(gè)類(lèi)型的實(shí)例。盡管構(gòu)造函數(shù)不是方法,但是它們?cè)诰幋a的時(shí)候使用了非常相似的語(yǔ)法。構(gòu)造函數(shù)通過(guò)確保所有實(shí)例的屬性都是有效的來(lái)創(chuàng)建一個(gè)新的實(shí)例。

構(gòu)造函數(shù)最簡(jiǎn)單的形式是使用init關(guān)鍵詞的一個(gè)類(lèi)似方法的函數(shù),并且沒(méi)有任何參數(shù):

復(fù)制代碼 代碼如下:
 
init() {
    // perform some initialization here
}

使用構(gòu)造函數(shù)語(yǔ)法TypeName和空的兩個(gè)小括號(hào)來(lái)完成一個(gè)Vehicle實(shí)例的創(chuàng)建:

復(fù)制代碼 代碼如下:
 
let someVehicle = Vehicle()

Vehicle的構(gòu)造函數(shù)為屬性設(shè)置了一些初始值(numberOfWheels = 0 然后 maxPassengers = 1)。

Vehicle類(lèi)定義的是一個(gè)通用的交通工具特性,它本身沒(méi)有太多意義,所以就需要沖定義它的一些屬性或者方法來(lái)讓它具有實(shí)際的意義。

2、產(chǎn)生子類(lèi)

產(chǎn)生子類(lèi)就是根據(jù)一個(gè)已有的類(lèi)產(chǎn)生新類(lèi)的過(guò)程。子類(lèi)繼承了父類(lèi)的一些可以修改的特性。還可以為子類(lèi)添加一些新的特性。

為了表明一個(gè)類(lèi)是繼承自一個(gè)父類(lèi),需要將父類(lèi)的名稱(chēng)寫(xiě)在子類(lèi)的后面,并且用冒號(hào)分隔:

復(fù)制代碼 代碼如下:
 
class SomeClass: SomeSuperclass {
    // class definition goes here
}

下面的例子定義了一種特定叫Bicycle的交通工具。這個(gè)新類(lèi)是基于已有的類(lèi)Vehicle產(chǎn)生的。書(shū)寫(xiě)方式是在類(lèi)名Bicycle后加冒號(hào)加父類(lèi)Vehicle名。

可以理解為:

定義一個(gè)新的類(lèi)叫Bicycle,它繼承了Vehicle的特性:

復(fù)制代碼 代碼如下:
 
class Bicycle: Vehicle {
    init() {
        super.init()
        numberOfWheels = 2
    }
}

Bicycle是Vehicle的子類(lèi),Vehicle是Bicycle的父類(lèi)。Bicycle類(lèi)繼承了Vehicle所有的特征,比如maxPassengers和numberOfWheels屬性。你還可以為Bicycle類(lèi)添加心的屬性。

Bicycle類(lèi)也定義了構(gòu)造函數(shù),在這個(gè)構(gòu)造函數(shù)中調(diào)用了父類(lèi)的構(gòu)造函數(shù)super.init(),這樣可以確保在Bicycle修改他們之前,父類(lèi)已經(jīng)初始化了。

注意:跟Objective-C不同的是,Swift中的構(gòu)造函數(shù)沒(méi)有默認(rèn)繼承。更多信息可以參考Initializer Inheritance and Overriding這一章節(jié)。

maxPassengers屬性在繼承自父類(lèi)的時(shí)候已經(jīng)被初始化了,對(duì)于Bicycle來(lái)說(shuō)是正確的,因此不需要再做更改。然后numberOfWheels是不對(duì)的,所以被替換成了2.

不僅屬性是繼承于Vehicle的,Bicycle還繼承了父類(lèi)的方法。如果你創(chuàng)建一個(gè)實(shí)例,然后調(diào)用了已經(jīng)繼承的description方法,可以得到該交通工具的描述并且看到它的屬性已經(jīng)被修改:

復(fù)制代碼 代碼如下:
 
let bicycle = Bicycle()
println("Bicycle: \(bicycle.description())")
// Bicycle: 2 wheels; up to 1 passengers

子類(lèi)本身也可以作為父類(lèi)被再次繼承:

復(fù)制代碼 代碼如下:
 
class Tandem: Bicycle {
    init() {
        super.init()
        maxPassengers = 2
    }
}

上面的例子創(chuàng)建了Bicycle的子類(lèi),叫做tandem,也就可以?xún)蓚€(gè)人一起騎的自行車(chē)。所以Tandem沒(méi)有修改numberOfWheels屬性,只是更新了maxPassengers屬性。

注意:子類(lèi)只能夠在構(gòu)造的時(shí)候修改變量的屬性,不能修改常量的屬性。

創(chuàng)建一個(gè)Tandem的實(shí)例,然后調(diào)用description方法檢查屬性是否被正確修改:

復(fù)制代碼 代碼如下:
 
let tandem = Tandem()
println("Tandem: \(tandem.description())")
// Tandem: 2 wheels; up to 2 passengers

注意到description方法也被Tandem繼承了。

3、重寫(xiě)方法

子類(lèi)可以提供由父類(lèi)繼承來(lái)的實(shí)例方法,類(lèi)方法,實(shí)例屬性或者下標(biāo)的個(gè)性化實(shí)現(xiàn)。這個(gè)特性被稱(chēng)為重寫(xiě)。

重寫(xiě)一個(gè)由繼承而來(lái)的方法需要在方法定義前標(biāo)注override關(guān)鍵詞。通過(guò)這樣的操作可以確保你所要修改的這個(gè)方法確實(shí)是繼承而來(lái)的,而不會(huì)出現(xiàn)重寫(xiě)錯(cuò)誤。錯(cuò)誤的重寫(xiě)會(huì)造成一些不可預(yù)知的錯(cuò)誤,所以如果如果不標(biāo)記override關(guān)鍵詞的話(huà),就會(huì)被在代碼編譯時(shí)報(bào)錯(cuò)。

override關(guān)鍵詞還能夠讓Swift編譯器檢查該類(lèi)的父類(lèi)是否有相符的方法,以確保你的重寫(xiě)是可用的,正確的。

訪(fǎng)問(wèn)父類(lèi)方法,屬性和下標(biāo)

當(dāng)在重寫(xiě)子類(lèi)繼承自父類(lèi)的方法,屬性或者下標(biāo)的時(shí)候,需要用到一部分父類(lèi)已有的實(shí)現(xiàn)。比如你可以重定義已知的一個(gè)實(shí)現(xiàn)或者在繼承的變量中存儲(chǔ)一個(gè)修改的值。

適當(dāng)?shù)臅r(shí)候,可以通過(guò)使用super前綴來(lái)訪(fǎng)問(wèn)父類(lèi)的方法,屬性或者下標(biāo):

叫someMethod的重寫(xiě)方法可以在實(shí)現(xiàn)的時(shí)候通過(guò)super.someMethod()調(diào)用父類(lèi)的someMethod方法。

叫someProperty的重寫(xiě)屬性可以在重寫(xiě)實(shí)現(xiàn)getter或者setter的時(shí)候通過(guò)super.someProperty調(diào)用父類(lèi)的someProperty。

叫someIndex的重寫(xiě)下標(biāo)可以在實(shí)現(xiàn)下標(biāo)的時(shí)候通過(guò)super[someIndex]來(lái)訪(fǎng)問(wèn)父類(lèi)的下標(biāo)。

復(fù)寫(xiě)方法

你可以在你的子類(lèi)中實(shí)現(xiàn)定制的繼承于父類(lèi)的實(shí)例方法或者類(lèi)方法。

下面的例子演示的就是一個(gè)叫Car的Vehicle子類(lèi),重寫(xiě)了繼承自Vehicle的description方法。

復(fù)制代碼 代碼如下:
 
class Car: Vehicle {
    var speed: Double = 0.0
    init() {
        super.init()
        maxPassengers = 5
        numberOfWheels = 4
    }
    override func description() -> String {
        return super.description() + "; "
            + "traveling at \(speed) mph"
    }
}

Car中定義了一個(gè)新的Double類(lèi)型的存儲(chǔ)屬性speed。這個(gè)屬性默認(rèn)值是0.0,意思是每小時(shí)0英里。Car還有一個(gè)自定義的構(gòu)造函數(shù),設(shè)置了最大乘客數(shù)為5,輪子數(shù)量是4.

Car重寫(xiě)了繼承的description方法,并在方法名description前標(biāo)注了override關(guān)鍵詞。

在description中并沒(méi)有給出了一個(gè)全新的描述實(shí)現(xiàn),還是通過(guò)super.description使用了Vehicle提供的部分描述語(yǔ)句,然后加上了自己定義的一些屬性,如當(dāng)前速度。

如果你創(chuàng)建一個(gè)Car的實(shí)例,然后調(diào)用description方法,會(huì)發(fā)現(xiàn)描述語(yǔ)句變成了這樣:

復(fù)制代碼 代碼如下:

let car = Car()
println("Car: \(car.description())")
// Car: 4 wheels; up to 5 passengers; traveling at 0.0 mph

復(fù)寫(xiě)屬性

你還可以提供繼承自父類(lèi)的實(shí)例屬性或者類(lèi)屬性的個(gè)性化getter和setter方法,或者是添加屬性觀(guān)察者來(lái)實(shí)現(xiàn)重寫(xiě)的屬性可以觀(guān)察到繼承屬性的變動(dòng)。

重寫(xiě)屬性的Getters和Setters

不管在源類(lèi)中繼承的這個(gè)屬性是存儲(chǔ)屬性還是計(jì)算屬性,你都可以提供一個(gè)定制的getter或者setter方法來(lái)重寫(xiě)這個(gè)繼承屬性。子類(lèi)一般不會(huì)知道這個(gè)繼承的屬性本來(lái)是存儲(chǔ)屬性還是計(jì)算屬性,但是它知道這個(gè)屬性有特定的名字和類(lèi)型。在重寫(xiě)的時(shí)候需要指明屬性的類(lèi)型和名字,好讓編譯器可以檢查你的重寫(xiě)是否與父類(lèi)的屬性相符。

你可以將一個(gè)只讀的屬性通過(guò)提那家getter和setter繼承為可讀寫(xiě)的,但是反之不可。

注意:如果你為一個(gè)重寫(xiě)屬性提供了setter方法,那么也需要提供getter方法。如果你不想在getter中修改繼承的屬性的值,可以在getter中使用super.someProperty即可,在下面SpeedLimitedCar例子中也是這樣。

下面的例子定義了一個(gè)新類(lèi)SpeedLimitedCar,是Car的一個(gè)子類(lèi)。這個(gè)類(lèi)表示一個(gè)顯示在40碼一下的車(chē)輛。通過(guò)重寫(xiě)繼承的speed屬性來(lái)實(shí)現(xiàn):

復(fù)制代碼 代碼如下:

class SpeedLimitedCar: Car {
    override var speed: Double  {
    get {
        return super.speed
    }
    set {
        super.speed = min(newValue, 40.0)
    }
    }
}

每當(dāng)你要設(shè)置speed屬性的時(shí)候,setter都會(huì)檢查新值是否比40大,二者中較小的值會(huì)被設(shè)置給SpeedLimitedCar。

如果你嘗試為speed設(shè)置超過(guò)40的值,description的輸出依然還是40:

復(fù)制代碼 代碼如下:

let limitedCar = SpeedLimitedCar()
limitedCar.speed = 60.0
println("SpeedLimitedCar: \(limitedCar.description())")
// SpeedLimitedCar: 4 wheels; up to 5 passengers; traveling at 40.0 mph

重寫(xiě)屬性觀(guān)察者

你可以使用屬性重寫(xiě)為繼承的屬性添加觀(guān)察者。這種做法可以讓你無(wú)論這個(gè)屬性之前是如何實(shí)現(xiàn)的,在繼承的這個(gè)屬性變化的時(shí)候都能得到提醒。更多相關(guān)的信息可以參考Property Observers這章。

注意:不能為繼承的常量存儲(chǔ)屬性或者是只讀計(jì)算屬性添加觀(guān)察者。這些屬性值是不能被修改的,因此不適合在重寫(xiě)實(shí)現(xiàn)時(shí)添加willSet或者didSet方法。

注意:不能同時(shí)定義重寫(xiě)setter和重寫(xiě)屬性觀(guān)察者,如果想要觀(guān)察屬性值的變化,并且又為該屬性給出了定制的setter,那只需要在setter中直接獲得屬性值的變化就行了。

下面的代碼演示的是一個(gè)新類(lèi)AutomaticCar,也是Car的一個(gè)子類(lèi)。這個(gè)類(lèi)表明一個(gè)擁有自動(dòng)變速箱的汽車(chē),可以根據(jù)現(xiàn)在的速度自動(dòng)選擇檔位,并在description中輸出當(dāng)前檔位:

復(fù)制代碼 代碼如下:

class AutomaticCar: Car {
    var gear = 1
    override var speed: Double {
    didSet {
        gear = Int(speed / 10.0) + 1
    }
    }
    override func description() -> String {
        return super.description() + " in gear \(gear)"
    }
}

這樣就可以實(shí)現(xiàn),每次你設(shè)置speed的值的時(shí)候,didSet方法都會(huì)被調(diào)用,來(lái)看檔位是否需要變化。gear是由speed除以10加1計(jì)算得來(lái),所以當(dāng)速度為35的時(shí)候,gear檔位為4:

復(fù)制代碼 代碼如下:

let automatic = AutomaticCar()
automatic.speed = 35.0
println("AutomaticCar: \(automatic.description())")
// AutomaticCar: 4 wheels; up to 5 passengers; traveling at 35.0 mph in gear 4

4、禁止重寫(xiě)

你可以通過(guò)標(biāo)記final關(guān)鍵詞來(lái)禁止重寫(xiě)一個(gè)類(lèi)的方法,屬性或者下標(biāo)。在定義的關(guān)鍵詞前面標(biāo)注@final屬性即可。

在子類(lèi)中任何嘗試重寫(xiě)父類(lèi)的final方法,屬性或者下標(biāo)的行為都會(huì)在編譯時(shí)報(bào)錯(cuò)。同樣在擴(kuò)展中為類(lèi)添加的方法,屬性或者下標(biāo)也可以被標(biāo)記為final。

還可以在類(lèi)關(guān)鍵詞class前使用@final標(biāo)記一整個(gè)類(lèi)為final(@final class)。任何子類(lèi)嘗試?yán)^承這個(gè)父類(lèi)時(shí)都會(huì)在編譯時(shí)報(bào)錯(cuò)。

相關(guān)文章

  • 在Swift中使用KVO的細(xì)節(jié)以及內(nèi)部實(shí)現(xiàn)解析(推薦)

    在Swift中使用KVO的細(xì)節(jié)以及內(nèi)部實(shí)現(xiàn)解析(推薦)

    這篇文章主要介紹了在Swift中使用KVO的細(xì)節(jié)以及內(nèi)部實(shí)現(xiàn)解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Swift自定義iOS中的TabBarController并為其添加動(dòng)畫(huà)

    Swift自定義iOS中的TabBarController并為其添加動(dòng)畫(huà)

    這篇文章主要介紹了Swift自定義iOS中的TabBarController并為其添加動(dòng)畫(huà)的方法,即自定義TabBarController中的的TabBar并為自定義的TabBar增加動(dòng)畫(huà)效果,需要的朋友可以參考下
    2016-04-04
  • Swift使用表格組件實(shí)現(xiàn)單列表

    Swift使用表格組件實(shí)現(xiàn)單列表

    這篇文章主要為大家詳細(xì)介紹了Swift使用表格組件實(shí)現(xiàn)單列表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 詳細(xì)講解Swift中的類(lèi)型占位符

    詳細(xì)講解Swift中的類(lèi)型占位符

    類(lèi)型占位符是swift5.6中引?的?個(gè)新功能,在處理稍微復(fù)雜的通?類(lèi)型時(shí),它可能真的很有用,這篇文章主要給大家介紹了關(guān)于Swift類(lèi)型占位符的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • 在Mac OS的終端中運(yùn)行Swift應(yīng)用的方法

    在Mac OS的終端中運(yùn)行Swift應(yīng)用的方法

    這篇文章主要介紹了在Mac OS的終端中運(yùn)行Swift應(yīng)用的方法,依靠Xcode的REPL功能來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2015-07-07
  • 蘋(píng)果公司編程語(yǔ)言Swift語(yǔ)言簡(jiǎn)介

    蘋(píng)果公司編程語(yǔ)言Swift語(yǔ)言簡(jiǎn)介

    這篇文章主要介紹了蘋(píng)果公司編程語(yǔ)言Swift語(yǔ)言簡(jiǎn)介,Swift 是一門(mén)新的編程語(yǔ)言,兼容Objective-C代碼,是用來(lái)代替Objective-C的蘋(píng)果主力開(kāi)發(fā)語(yǔ)言,需要的朋友可以參考下
    2014-07-07
  • Swift?中的?RegexBuilder學(xué)習(xí)指南

    Swift?中的?RegexBuilder學(xué)習(xí)指南

    這篇文章主要為大家介紹了Swift中的RegexBuilder學(xué)習(xí)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Swift4.0 Array數(shù)組詳解

    Swift4.0 Array數(shù)組詳解

    這篇文章主要為大家詳細(xì)介紹了Swift4.0 Array數(shù)組的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Swift中常量和變量的區(qū)別與聲明詳解

    Swift中常量和變量的區(qū)別與聲明詳解

    Swift語(yǔ)言同樣和Java和OC等語(yǔ)言一樣是同樣是需要聲明常量和變量的,下面就讓我們來(lái)學(xué)習(xí)一下Swift的常量和變量。這篇文章主要給大家介紹了關(guān)于Swift中常量和變量的區(qū)別與聲明的相關(guān)資料,需要的朋友可以參考下。
    2017-11-11
  • iOS中Swift指觸即開(kāi)集成Touch ID指紋識(shí)別功能的方法

    iOS中Swift指觸即開(kāi)集成Touch ID指紋識(shí)別功能的方法

    隨著移動(dòng)支付時(shí)代的到來(lái),Touch ID 指紋驗(yàn)證迅速被支付寶,微信錢(qián)包普及,相信各位朋友使用后也大呼方便。下面給大家分享iOS中Swift指觸即開(kāi)集成Touch ID指紋識(shí)別功能的方法,一起看看吧
    2017-03-03

最新評(píng)論

图们市| 镇赉县| 嫩江县| 古丈县| 南木林县| 塘沽区| 涞源县| 澳门| 潜山县| 蕉岭县| 山东省| 双鸭山市| 吉林省| 中超| 岐山县| 赤壁市| 佛坪县| 泰宁县| 台湾省| 宁乡县| 柳河县| 岐山县| 舒兰市| 宜州市| 唐海县| 监利县| 栾城县| 珠海市| 文化| 于都县| 双柏县| 双城市| 衡山县| 安西县| 泗洪县| 郁南县| 墨竹工卡县| 长寿区| 囊谦县| 建阳市| 夏津县|