欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入解析Swift編程中的構(gòu)造方法

 更新時間:2016年07月01日 18:19:18   投稿:goldensun  
先進的Swfit語言同樣具有構(gòu)造方法,構(gòu)造方法在對象被創(chuàng)建后會首先被調(diào)用,這里我們就來深入解析Swift編程中的構(gòu)造方法:

一、引言
構(gòu)造方法是一個類創(chuàng)建對象最先也是必須調(diào)用的方法,在Objective-C中,開發(fā)者更習慣稱這類方法為初始化方法。在Objective-C中的初始化方法與普通函數(shù)相比除了要以init抬頭外并無太嚴格的分界,而在Swift語言體系中,構(gòu)造方法與普通的方法分界十分嚴格,從格式寫法上就有不同,普通方法函數(shù)要以func聲明,構(gòu)造方法統(tǒng)一為init命名,不需要func關(guān)鍵字聲明,不同的構(gòu)造方法采用方法重載的方式創(chuàng)建。

二、構(gòu)造方法的復寫與重載
在Objective-C中,不同的初始化方法就是不同的函數(shù),這便不存在方法重載的概念。Swift中要創(chuàng)建自定義的構(gòu)造方法,需要開發(fā)者對init構(gòu)造方法進行重載操作。任何一個自定義的類,只要其有父類,除了可以繼承下來父類已有的構(gòu)造方法外,還可以復寫父類的構(gòu)造方法,使其適用于自身。和Objective-C類似,復寫父類的構(gòu)造方法時,要在其中調(diào)用父類的構(gòu)造方法,重載可以理解為一種特殊的復寫父類構(gòu)造方法,因此在重載的構(gòu)造方法中也要調(diào)用父類的構(gòu)造方法。

創(chuàng)建一個繼承于NSObject的類,復寫構(gòu)造方法,代碼示例如下:

class ClassOne: NSObject {
  //聲明一個本類特有的常量
  var tip:Int
  //復寫父類的構(gòu)造方法 需要用override關(guān)鍵字
  override init() {
    //構(gòu)造方法中要對所有成員常量完成創(chuàng)建
    tip = 1;
    //在創(chuàng)建完所有成員常量后 調(diào)用父類構(gòu)造方法
    super.init()
  }
  //重載構(gòu)造方法1
  init(one:Int){
    tip=one
    super.init()
  }
  //重載構(gòu)造方法2 使用convenience關(guān)鍵字進行修飾
  convenience init(two:String) {
    //使用convenience關(guān)鍵字進行修飾的構(gòu)造方法要調(diào)用本類的構(gòu)造方法進行
    self.init(one: two.characters.count)
  }
  //重載構(gòu)造方法3 使用required關(guān)鍵字進行修飾 使用required關(guān)鍵字進行修飾的構(gòu)造方法子類必須繼承或復寫
  required init(three:Float) {
    tip=10
    super.init()
  }

上面示例代碼中,不帶參數(shù)的init()方法為復寫父類的方法,因此需要使用關(guān)鍵字override來修飾。重載構(gòu)造方法1帶一個Int類型的 參數(shù),父類中并沒有這個構(gòu)造方法,但是在其實現(xiàn)中,依然需要調(diào)用父類中的某個構(gòu)造方法完成。構(gòu)造方法2是一個帶String類型參數(shù)的構(gòu)造方法,其用convenience關(guān)鍵字為構(gòu)造方法的一個修飾關(guān)鍵字,后面會介紹。構(gòu)造方法3為一個帶Float類型參數(shù)的構(gòu)造方法,但其使用required關(guān)鍵字進行了修飾,使用required關(guān)鍵字進行修飾的構(gòu)造方法子類必須繼承或者復寫。構(gòu)造方法1,2,3都是對init()構(gòu)造方法的一種重載,但卻是3中類型全然不同的構(gòu)造方法。

三、Designated構(gòu)造方法與Convenience構(gòu)造方法

Swift中的構(gòu)造方法分為Designated構(gòu)造方法與Convenience構(gòu)造方法兩類,Designated構(gòu)造方法也被稱為指定構(gòu)造方法,Convenience構(gòu)造方法也被稱為方便構(gòu)造方法。Designated構(gòu)造方法不加任何修飾關(guān)鍵字,Convenience構(gòu)造方法需要使用Convenience關(guān)鍵字進行修飾??梢赃@樣理解,Convenience類型的構(gòu)造方法是為了方便使用從Designated構(gòu)造方法中分支出來的構(gòu)造方法,官方文檔中有如下描述:

1.子類Designated構(gòu)造方法中必須調(diào)用父類的Designated構(gòu)造方法。

2.Convenience構(gòu)造方法中必須調(diào)用當前類的構(gòu)造方法。

3.Convenience構(gòu)造方法歸根結(jié)底要調(diào)用到Designated構(gòu)造方法。

官方文檔的一張圖可以清晰的描述上述關(guān)系:

201671180544418.jpg (916×896)

四、構(gòu)造方法的繼承關(guān)系

關(guān)于子類繼承父類的構(gòu)造方法有這樣幾個特性:

1.如果子類沒有復寫任何父類的構(gòu)造方法,則默認子類將繼承所有父類的構(gòu)造方法,包括Designated構(gòu)造方法與Convenience構(gòu)造方法。

2.如果子類復寫了父類某一構(gòu)造方法,則子類默認不在繼承所有父類的構(gòu)造方法,對于Designated類型的構(gòu)造方法,子類復寫了哪些,哪些才能夠被使用,對于Convenienve類型的構(gòu)造方法,子類復寫的其調(diào)用的Designated構(gòu)造方法后會被自動繼承。

3.如果父類中的構(gòu)造方法是required修飾的,則子類必須進行繼承或復寫。

曾經(jīng)有朋友和我抱怨,Objective-C中的繼承是一種十分不人性,它強制子類繼承所有父類的方法與屬性無論子類是否需要,分析上面的一些規(guī)則可以發(fā)現(xiàn),Swift與Objective-C相比,在構(gòu)造方法方面語法會更加嚴格,這樣做在編程上更加安全。在Objective-C中,子類將被強制繼承所有父類的初始化方法,這樣開發(fā)者在使用時常常會出現(xiàn)疑惑,有時一個子類往往有特定的初始化方法,僅僅通過父類的初始化方法不能夠正確的完成初始化,在編程時,往往需要特殊注釋來提示開發(fā)者。Swift設定的這些構(gòu)造方法原則可以將無關(guān)的父類構(gòu)造方法剔除在外,在編程時更加嚴格安全,減少疑惑與不可控因素。

五、構(gòu)造方法的實現(xiàn)原則

無論Designated類型的構(gòu)造方法還是Convenience類型的構(gòu)造方法,只要其有父類,最終都要實現(xiàn)父類的Designated構(gòu)造方法。Swift語言要求,在構(gòu)造方法中要完成所有成員常量或者變量的構(gòu)造或賦值(optional值除外)。在對成員常量或變量進行構(gòu)造賦值時,要在調(diào)用父類的初始化方法之前,這里還有一點需要注意,父類的成員屬性也會被子類繼承,如果要在子類復寫的父類方法中對繼承來的父類成員屬性進行重新構(gòu)造或賦值,則必須在調(diào)用父類構(gòu)造方法之后,例如創(chuàng)建ClassTwo類繼承于ClassOne,復寫方法如下:

class ClassTwo: ClassOne {
  //子類自己的屬性
  let tipTwo:Int
  override init() {
    //調(diào)用父類構(gòu)造方法前進行自己屬性的構(gòu)造
    tipTwo = 1
    //調(diào)用父類構(gòu)造方法
    super.init()
    //對從父類繼承來的屬性進行重構(gòu)造
    tip = 1000;
  }
  
  required init(three: Float) {
    fatalError("init(three:) has not been implemented")
  }
  

}

Swift語言這種強制化得構(gòu)造規(guī)則,能夠保證一個類在完成構(gòu)造時,其內(nèi)部的所有屬性都構(gòu)造完成。在使用Objective-C進行開發(fā)時,很多初學者都可能會遇到這樣一種情況,完成了某個類的初始化,但向類的屬性進行賦值時卻沒有成功,因為Objective-C中并沒有這樣的語法,在類初始化成功后,其屬性是否初始化了完全取決于開發(fā)者,Swift優(yōu)化了這一設計。

綜上可以了解,Swift語言雖然更加嚴格,卻將更多本來需要開發(fā)者注意的地方交由了編譯器,實際上是減輕了開發(fā)者的負擔。

相關(guān)文章

  • Swift中的條件判斷、循環(huán)、跳轉(zhuǎn)語句基礎學習筆記

    Swift中的條件判斷、循環(huán)、跳轉(zhuǎn)語句基礎學習筆記

    if、for和while循環(huán)、switch等這些基本的程序流程控制語句基本上是每個編程語言的標配,在入門環(huán)節(jié)中,這里對Swift中的條件判斷、循環(huán)、跳轉(zhuǎn)語句基礎學習筆記作了一個整理:
    2016-06-06
  • Swift中排序算法的簡單取舍詳解

    Swift中排序算法的簡單取舍詳解

    對于排序算法, 通常簡單的, 為大家所熟知的有, 選擇排序, 冒泡排序, 快速排序, 當然還有哈希, 桶排序之類的, 本文僅比較最為常見的選擇, 冒泡和快排,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-03-03
  • Swift心得筆記之運算符

    Swift心得筆記之運算符

    區(qū)別于 C 語言,在 Swift 中你可以對浮點數(shù)進行取余運算(%),Swift 還提供了 C 語言沒有的表達兩數(shù)之間的值的區(qū)間運算符,(a..b和a...b),這方便我們表達一個區(qū)間內(nèi)的數(shù)值。
    2015-04-04
  • 深入講解Swift中的模式匹配

    深入講解Swift中的模式匹配

    在Swift中,一些模式已經(jīng)被語言特性所吸收,你在使用Swift甚至察覺不出這類問題的存在,下面這篇文章主要給大家介紹了關(guān)于Swift中模式匹配的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-08-08
  • Swift中動態(tài)調(diào)用實例方法介紹

    Swift中動態(tài)調(diào)用實例方法介紹

    這篇文章主要介紹了Swift中動態(tài)調(diào)用實例方法介紹,在Swift中有一類很有意思的寫法,可以讓我們不直接使用實例來調(diào)用這個實例上的方法,而是通過類型取出這個類型的某個實例方法的簽名,然后再通過傳遞實例來拿到實際需要調(diào)用的方法,需要的朋友可以參考下
    2015-01-01
  • Swift快速集成下拉刷新和上拉加載更多示例代碼

    Swift快速集成下拉刷新和上拉加載更多示例代碼

    這篇文章主要介紹了Swift快速集成下拉刷新和上拉加載更多示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Swift使用transform 實現(xiàn)重復平移動畫效果

    Swift使用transform 實現(xiàn)重復平移動畫效果

    這篇文章主要介紹了Swift使用transform 實現(xiàn)重復平移動畫效果,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • 在Swift中使用Objective-C編寫類、繼承Objective-C類

    在Swift中使用Objective-C編寫類、繼承Objective-C類

    這篇文章主要介紹了在Swift中使用Objective-C編寫類、繼承Objective-C類等操作方法介紹,需要的朋友可以參考下
    2014-07-07
  • switch多選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)示例詳解

    switch多選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)示例詳解

    這篇文章主要介紹了switch多選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu),本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Swift 基本數(shù)據(jù)類型詳解總結(jié)

    Swift 基本數(shù)據(jù)類型詳解總結(jié)

    在我們使用任何程序語言編程時,需要使用各種數(shù)據(jù)類型來存儲不同的信息。變量的數(shù)據(jù)類型決定了如何將代表這些值的位存儲到計算機的內(nèi)存中。在聲明變量時也可指定它的數(shù)據(jù)類型。所有變量都具有數(shù)據(jù)類型,以決定能夠存儲哪種數(shù)據(jù)
    2021-11-11

最新評論