Swift2.0(13)構(gòu)造方法-創(chuàng)新互聯(lián)

  • 構(gòu)造方法

    成都創(chuàng)新互聯(lián)公司成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元榆林做網(wǎng)站,已為上家服務(wù),為榆林各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

實(shí)例對(duì)象在被創(chuàng)建時(shí),需要對(duì)存儲(chǔ)屬性初始化,兩種方式:

   方法一:在聲明屬性的同時(shí)設(shè)定初值(之前一直使用這種方式)

   方法二:使用構(gòu)造方法

構(gòu)造方法init:在對(duì)象創(chuàng)建時(shí)自動(dòng)調(diào)用并對(duì)實(shí)例對(duì)象的存儲(chǔ)屬性進(jìn)行初始化

   a. 無需func關(guān)鍵字聲明

   b. 參數(shù)列表里可以有多個(gè)參數(shù),也可以沒有參數(shù),參數(shù)可以有默認(rèn)值

   c. 支持重寫和重載

   d. 沒有返回值

     如:

   class Person{
       var name:String
       var age:Int
       init(name:String, age:Int) {
           self.name = name
           self.age = age
       }
       init(name1:String) {
           self.name = name1
           self.age = 11
       }
       init(name2:String) {
           self.name = name2
           self.age = 12
       }
       init() {
           self.name = "123"
           self.age = 20
       }
   }
   var p1:Person = Person()
   print("name:\(p1.name) age:\(p1.age)")//name:123 age:20
   var p2:Person = Person(name1: "iOS")
   print("name:\(p2.name) age:\(p2.age)")//name:iOS age:11
   var p3:Person = Person(name2: "iOS")
   print("name:\(p3.name) age:\(p3.age)")//name:iOS age:12
   var p4:Person = Person(name: "iPhone", age: 7)

   print("name:\(p4.name) age:\(p4.age)")//name:iPhone age:7

   init()方法是強(qiáng)制包含外部參數(shù)名的,即使未顯式寫出,也是有的,相當(dāng)于參數(shù)名前有#,可以使用 _ 關(guān)閉這個(gè)強(qiáng)制功能

     這里有四個(gè)重載的init()方法,其中有兩個(gè)方法僅僅外部參數(shù)名不同,也可以進(jìn)行重載(普通函數(shù)不可以)

構(gòu)造方法中的常量:

   常量屬性,在構(gòu)造方法內(nèi)部是可以變的,即構(gòu)造方法執(zhí)行后才是真正的常量

   注意:子類的構(gòu)造方法不能修改父類常量屬性的值

  • 構(gòu)造方法的分類

默認(rèn)構(gòu)造方法:適用于類、結(jié)構(gòu)體、枚舉

   當(dāng)所有的存儲(chǔ)屬性都有默認(rèn)值時(shí)由系統(tǒng)自動(dòng)生成

   如果存儲(chǔ)屬性是一個(gè)可選類型,則不必設(shè)置默認(rèn)值也能具有默認(rèn)構(gòu)造方法,其默認(rèn)值為nil

指定構(gòu)造方法:顯式地寫出并且可重載,需要為每個(gè)存儲(chǔ)屬性初始化

便捷構(gòu)造方法:內(nèi)部調(diào)用其他構(gòu)造方法

   需要在init()前加convenience關(guān)鍵字聲明

   只有在便捷構(gòu)造方法中可以顯式調(diào)用構(gòu)造方法,如:

     convenience init() {

        self.init(name:"123", age:20)

     }

可失敗構(gòu)造方法:在某些情況下構(gòu)造對(duì)象失敗后,返回nil

   返回nil,意味著返回值類型是一個(gè)可選類型,語法:init?()

   可失敗構(gòu)造方法可以聲明為便捷構(gòu)造方法

   如:

     convenience init?(age:Int) {

        self.init(name:"123", age:age)

        if ( age < 0 ) {

          return nil

        }

     }

     var p1:Person? = Person(age: 5)

   隱式解綁的可失敗構(gòu)造方法,即返回值是解綁后的,語法init!()

      也就意味著返回值不再是一個(gè)可選類型,也就意味著可失敗構(gòu)造方法返回nil程序會(huì)崩潰

  • 繼承中的構(gòu)造過程

先來看一段代碼:

   class Animal {
       var age:Int
       init() {
           self.age = 10
           print("Animal init.")
       }
   }
   class Dog:Animal {
       var name:String
       override init() {
           self.name = "abc"
           print("Dog init.")
       }
   }
   var p = Dog()

   print("age:\(p.age) name:\(p.name)")

   輸出的結(jié)果:

        Dog init.

        Animal init.

        age:10 name:abc

   重要說明:子類的構(gòu)造方法一定調(diào)用了父類的構(gòu)造方法完成父類部分的初始化

父子類構(gòu)造方法的調(diào)用順序:

   上面例子中,在子類的init()中并沒有顯式調(diào)用,則父類的init()實(shí)在子類init()的最后隱式調(diào)用

   存在的問題是:在子類的init()中不能訪問父類的屬性

   解決方法:子類的init()中顯式調(diào)用父類構(gòu)造方法

       override init() {
           self.name = "abc"
           super.init()
           self.age++
           print("Dog init.")

       }

   需要注意的是:顯式調(diào)用父類構(gòu)造方法,必須在子類存儲(chǔ)屬性初始化后進(jìn)行

子類也可以添加構(gòu)造方法,子類構(gòu)造方法內(nèi)部也可以指定調(diào)用其他構(gòu)造方法

   class Animal {
       var age:Int
       init() {
           self.age = 10
       }
       init(age:Int) {
           self.age = age
       }
   }
   class Dog:Animal {
       var name:String
       override init() {
           self.name = "abc"
           super.init()
           self.age++
       }
       init(age:Int, name:String) {
           self.name = name
           super.init(age: age)
       }

   }
   var p = Dog(age: 22, name: "ABC")

   print("age:\(p.age) name:\(p.name)")

  • 析構(gòu)方法

與構(gòu)造方法相反,對(duì)象即將被銷毀前,會(huì)自動(dòng)調(diào)用析構(gòu)方法

   a. 析構(gòu)方法 deinit 不帶任何參數(shù)也沒有返回值,不用func修飾

   b. 有默認(rèn)析構(gòu)方法,也可以顯式寫出代替

   c. 析構(gòu)方法不能重載

   d. 子類實(shí)例對(duì)象銷毀時(shí),先調(diào)用子類的析構(gòu)方法,再調(diào)用父類的析構(gòu)方法

   e. 任何位置都不能顯式調(diào)用deinit

   class Animal {
       var age:Int
       init() {
           self.age = 10
       }
       init(age:Int) {
           self.age = age
       }
       deinit {
           print("Animal deinit.")
       }
   }
   class Dog:Animal {
       var name:String
       override init() {
           self.name = "abc"
           super.init()
           self.age++
       }
       init(age:Int, name:String) {
           self.name = name
           super.init(age: age)
       }
       deinit {
           print("Dog deinit")
       }
   }
   var p = Dog(age: 22, name: "ABC")

   print("age:\(p.age) name:\(p.name)")

   p = Dog()   //基于ARC機(jī)制,此時(shí)上一個(gè)Dog實(shí)例對(duì)象被銷毀

   輸出結(jié)果:

        age:22 name:ABC

        Dog deinit

        Animal deinit.

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

分享文章:Swift2.0(13)構(gòu)造方法-創(chuàng)新互聯(lián)
文章URL:http://www.muchs.cn/article6/cdeeog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、域名注冊(cè)、網(wǎng)站改版外貿(mào)建站、網(wǎng)站設(shè)計(jì)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化