構(gòu)造方法總結(jié)一

作用:對實例對象的內(nèi)容進行初始化
Swift要求類或者結(jié)構(gòu)體中的存儲屬性(非lazy的)在對象構(gòu)造完畢后要有初始化值

語法:
init(參數(shù)列表){
    初始化代碼
}

注意:

  1. Swift中類/結(jié)構(gòu)體/枚舉都需要構(gòu)造方法
  2. 構(gòu)造方法的作用僅僅是用于初始化屬性斥赋,而不是分配內(nèi)容擒贸,分配內(nèi)存是系統(tǒng)幫我們做的
  3. 構(gòu)造方法是隱式調(diào)用的价涝,通過 類名稱()形式創(chuàng)建一個對象就會隱式調(diào)用init()構(gòu)造方法
  4. 如果所有的存儲屬性都有默認值改览,可以不提供構(gòu)造方法誊稚,系統(tǒng)會提供一個隱式的構(gòu)造方法
  5. 如果存儲屬性可以提供缺省值舔示,那么提倡大家使用設(shè)置缺省值的方式尊浓,這樣可以簡化代碼(不用自定義狗仔方法,不用寫存儲屬性類型)

不帶參數(shù)的構(gòu)造方法

class Person{
    var name : String = "zx"
    var age : Int
    func description() -> String {
        return "name = \(name) age = \(age)"
    }
    init() {
        print("init")
        age = 3
    }
}

/*
 1.分配內(nèi)存
 2.初始化name和age
 3.構(gòu)造方法是隱式調(diào)用的
 */
var p = Person()
p.description()//顯示調(diào)用

帶參數(shù)的構(gòu)造方法


class Person2{
    var name:String
    var age:Int
    func description() ->String{
        return "name = \(name) age = \(age)"
    }

    /*
     構(gòu)造方法的內(nèi)部參數(shù)退腥,默認也是外部參數(shù)
     構(gòu)造方法對屬性的順序沒有要求超营,只要保證對象構(gòu)造完成時所有存儲屬性被初始化即可
     */
    init(age:Int, name:String)
    {
        self.age = age
        self.name = name
    }

}
//var p2 = Person2(name: "zx", age: 30)
var p3 = Person2(age: 30, name: "zx")

可選屬性與構(gòu)造方法

class Car{
    let name: String
    init(name:String) {
        self.name = name
    }
}

class Person3{
    let name : String
    var age : Int
    var car : Car?
    
    /*
      可選值存儲屬性可以不再構(gòu)造方法中初始化,
      也就是說可選值在對象構(gòu)造完畢后不用初始化
      其實如果不對可選存儲屬性進行初始化, 默認就是nil
    */
    init(age:Int,name:String) {
        self.age = age
        self.name = name
    }
    
    func description() ->String{
        return "name = \(name) age = \(age)"
    }
    
}

結(jié)構(gòu)體構(gòu)造方法

struct Rect{
    
    var width : Double = 0.0
    var height : Double = 0.0
    
    //系統(tǒng)默認會提供一個類似的方法
    /*
    init(width:Double,height:Double) {
        self.width = width
        self.height = height
    }
    
    init() {
        self.width = 0.0
        self.height = 0.0
    }
    */
    
}
var r = Rect()
//var r = Rect(width: 1.0, heigth: 1.0)

/*
 注意: 
 1.在類中默認是沒有逐一構(gòu)造器的
 2.如果在結(jié)構(gòu)體中自定義了構(gòu)造方法, 那么系統(tǒng)不會生成默認的逐一構(gòu)造器
 3.如果給存儲屬性提供了缺省值, 系統(tǒng)還是會提供默認的逐一構(gòu)造器
   var r = Rect(width: 1.0, heigth: 1.0)
 4.如果給存儲屬性提供了缺省值, 可以使用不帶參數(shù)的方法初始化結(jié)構(gòu)體
 */

"值類型"的構(gòu)造器代理


/*
 構(gòu)造器代理: 構(gòu)造方法之間的相互調(diào)用
 構(gòu)造方法可以調(diào)用其他構(gòu)造方法來完成實例的構(gòu)造, 稱之為構(gòu)造器代理
 好處: 減少構(gòu)造方法之間的重復代碼
 */
struct Rect2 {
    var width:Double
    var height:Double
    
    init(width:Double, height:Double)
    {
        self.width = width
        self.height = height
    }
    
    
    init()
    {
        //        self.width = 0
        //        self.height = 0
        // 構(gòu)造器代理
        self.init(width:0, height:0)
    }
    func show(){
        print("width = \(width) height = \(height)")
    }
}
var r2 = Rect2()
r2.show()
var r3 = Rect2(width: 100, height: 100)
r3.show()

通過閉包或者全局函數(shù)/類方法 設(shè)置存儲屬性的缺省值



func getTel() ->Int{
    print("getTel")
    return 11111111111
}
class Person4{
    var name : String
    //系統(tǒng)在初始化的時候回隱式執(zhí)行閉包,將閉包的執(zhí)行結(jié)果賦值給存儲屬性
    var age : Int = {
        print("age 閉包")
        return 30
    }()
    lazy var height:Double = {
        print("lazy 閉包")
        return 180.0
    }()
    
    
    class func getAddress() -> String{
        print("class getAddress")
        return "北京"
    }
    
    func getNickName() -> String
    {
        return "小明"
    }
    
    var tel = getTel()
    var address = Person4.getAddress()
    /*
     不能這樣寫, 因為調(diào)用方法時對象還沒有初始化完畢
     self只有當所有的存儲屬性都初始化完畢之后才可以用
     var nickName = self.getNickName
    */
    
    init(name:String)
    {
        print("init")
        self.name = name
    }
}


var p5 = Person4(name: "zx")
// 懶加載是用到時才執(zhí)行, 而閉包賦值是初始化時就會執(zhí)行
print(p5.height)
/*
 執(zhí)行結(jié)果:
 age 閉包
 getTel
 class getAddress
 init
 lazy 閉包
 180.0
 */

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阅虫,一起剝皮案震驚了整個濱河市演闭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颓帝,老刑警劉巖米碰,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異购城,居然都是意外死亡吕座,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門瘪板,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吴趴,“玉大人,你說我怎么就攤上這事侮攀÷嘀Γ” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵兰英,是天一觀的道長撇叁。 經(jīng)常有香客問我,道長畦贸,這世上最難降的妖魔是什么陨闹? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮薄坏,結(jié)果婚禮上趋厉,老公的妹妹穿的比我還像新娘。我一直安慰自己胶坠,他們只是感情好君账,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涵但,像睡著了一般杈绸。 火紅的嫁衣襯著肌膚如雪帖蔓。 梳的紋絲不亂的頭發(fā)上矮瘟,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天瞳脓,我揣著相機與錄音,去河邊找鬼澈侠。 笑死劫侧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的哨啃。 我是一名探鬼主播烧栋,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拳球!你這毒婦竟也來了审姓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤祝峻,失蹤者是張志新(化名)和其女友劉穎魔吐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莱找,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡酬姆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奥溺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辞色。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浮定,靈堂內(nèi)的尸體忽然破棺而出相满,到底是詐尸還是另有隱情,我是刑警寧澤桦卒,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布雳灵,位于F島的核電站,受9級特大地震影響闸盔,放射性物質(zhì)發(fā)生泄漏悯辙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一迎吵、第九天 我趴在偏房一處隱蔽的房頂上張望躲撰。 院中可真熱鬧,春花似錦击费、人聲如沸拢蛋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谆棱。三九已至快压,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垃瞧,已是汗流浹背蔫劣。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留个从,地道東北人脉幢。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像嗦锐,于是被迫代替她去往敵國和親嫌松。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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