Swift初始化相關(guān)內(nèi)容

初始化

初始化器

1痘绎、類缎患、結(jié)構(gòu)體、枚舉都可以定義初始化器

class Size {
    init(age: Int) {
        
    }
}

var s = Size(age: 10)

2达布、類有2種初始化器:指定初始化器(deaignated initializer)吐限、便捷初始化器(convenience initializer)

class Size {
    //指定初始化器
    init(age: Int) {
        
    }
    
    //便捷初始化器
    convenience init(age: Int) {
        
    }
}

3琅翻、每個類至少有一個指定初始化器悴能,指定初始化器是類的主要初始化器

4携悯、默認(rèn)初始化器總是類的指定初始化器

5杂伟、類偏向于少量指定初始化器移层,一個類通常只有一個指定初始化器

6、初始化器的相互調(diào)用規(guī)則赫粥,會更安全

    指定初始化器必須從它的直系父類調(diào)用指定初始化器观话;
class Person {
    var age: Int
    
    init(age: Int) {
        self.age = age
    }
    
    convenience init() {
        self.init(age: 0)
    }
}

class Student: Person {
    var score: Int
    
    init(age: Int, score: Int) {
        self.score = score
        super.init(age: age)
    }
}
   便捷初始化器必須從相同的類里調(diào)用另一個初始化器;

   便捷初始化器最終必須調(diào)用一個指定初始化器越平;
class Size {
    var width: Int
    var height: Int
    
    init(width: Int, height: Int) {
        self.width = width
        self.height = height
    }
    
    convenience init(width: Int) {
        self.init(width: width, height: 0)
    }
    
    convenience init(height: Int) {
        self.init(width: 0, height: height)
    }
    
    convenience init() {
        self.init(width: 0, height: 0)
    }
}

var s1 = Size(width: 10, height: 20)
var s2 = Size(width: 10)
var s3 = Size(height: 20)
var s4 = Size()

初始化器的相互調(diào)用

[圖片上傳失敗...(image-291343-1658117494066)]

兩段式初始化

1频蛔、Swift在編碼安全方面是煞費苦心,為了保證初始化過程的安全秦叛,設(shè)定了兩段式初始化晦溪、安全檢查。

2挣跋、兩段式初始化三圆,第1階段:初始化所有存儲屬性

    外層調(diào)用指定\便捷初始化器

    分配內(nèi)存給實例,但未初始化

    指定初始化器確保當(dāng)前類定義的存儲屬性都初始化

    指定初始化器調(diào)用父類的初始化器,不斷向上調(diào)用舟肉,形成初始化器鏈

3修噪、兩段式初始化,第2階段:設(shè)置新的存儲屬性值

    從頂部初始化器往下路媚,鏈中的每一個指定初始化器都有機(jī)會進(jìn)一步定制實例

    初始化器現(xiàn)在能夠使用self(訪問黄琼、修改它的屬性,調(diào)用它的實例方法等等)

    最終整慎,鏈中任何便捷初始化器都有機(jī)會定制實例以及使用self
class Person {
    var age: Int
    
    init(age: Int) {
        self.age = age
        
        self.test()
    }
    
    func test() {
        
    }
}

class Student: Person {
    var score: Int
    
    init(age: Int, score: Int) {
        self.score = score
        
        super.init(age: age)
    }
    
    convenience init() {
        self.init(age: 0, score: 0)
    }
}

安全檢查

1脏款、指定初始化器必須保證在調(diào)用父類初始化器之前,其所在類定義的所有存儲屬性都要初始化完成

2裤园、指定初始化器必須先調(diào)用父類初始化器弛矛,然后才能為繼承的屬性設(shè)置新值

3、便捷初始化器必須先調(diào)用同類中的其他初始化器比然,然后再為任意屬性設(shè)置新值

4丈氓、初始化器在第1階段初始化完成之前,不能調(diào)用任何實例方法强法,不能讀取任何實例屬性的值万俗,也不能引用self

重寫

1、當(dāng)重寫父類的指定初始化器時饮怯,必須加上override(即使子類的實現(xiàn)是便捷初始化器)

2闰歪、如果子類寫了一個匹配父類便捷初始化器的初始化器,不用加上override

    因為父類的便捷初始化器永遠(yuǎn)不會通過子類直接調(diào)用蓖墅,因此库倘,嚴(yán)格來說,子類無法無法重寫

    父類的便捷初始化器论矾。
class Person {
    var age: Int
    
    init(age: Int) {
        self.age = age
    }
    
    convenience init() {
        self.init(age: 0)
    }
}

class Student: Person {
    var score: Int
    
    init(age: Int, score: Int) {
        self.score = score
        super.init(age: age)
    }
    
    init() {
        self.score = 0
        super.init(age: 0)
    }
}

自動繼承

1教翩、如果子類沒有自定義任何指定初始化器,他會自動繼承父類所有的指定初始化器

2贪壳、如果子類提供了父類所有指定初始化器的實現(xiàn)(要么通過方式1繼承饱亿,要么重寫)

    子類會自動繼承所有的父類便捷初始化器

3、就算子類添加了更多的便捷初始化器闰靴,這些規(guī)則仍然適用

class Person {
    var age: Int
    var name: String
    
    init(age: Int, name: String) {
        self.age = age
        self.name = name
    }
    
    init() {
        self.age = 0
        self.name = ""
    }
    
    convenience init(age: Int) {
        self.init(age: age, name: "")
    }
    
    convenience init(name: String) {
        self.init(age: 0, name: name)
    }
}

class Student: Person {
    var no: Int = 0
    
    convenience init(no: Int) {
        self.init()
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末彪笼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚂且,更是在濱河造成了極大的恐慌配猫,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杏死,死亡現(xiàn)場離奇詭異泵肄,居然都是意外死亡佳遣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門凡伊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來零渐,“玉大人,你說我怎么就攤上這事系忙∷信危” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵银还,是天一觀的道長风宁。 經(jīng)常有香客問我,道長蛹疯,這世上最難降的妖魔是什么戒财? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮捺弦,結(jié)果婚禮上饮寞,老公的妹妹穿的比我還像新娘。我一直安慰自己列吼,他們只是感情好幽崩,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寞钥,像睡著了一般慌申。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上理郑,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天蹄溉,我揣著相機(jī)與錄音,去河邊找鬼您炉。 笑死柒爵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的邻吭。 我是一名探鬼主播餐弱,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼宴霸,長吁一口氣:“原來是場噩夢啊……” “哼囱晴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瓢谢,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤畸写,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后氓扛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枯芬,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡论笔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了千所。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狂魔。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖淫痰,靈堂內(nèi)的尸體忽然破棺而出最楷,到底是詐尸還是另有隱情,我是刑警寧澤待错,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布籽孙,位于F島的核電站,受9級特大地震影響火俄,放射性物質(zhì)發(fā)生泄漏犯建。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一瓜客、第九天 我趴在偏房一處隱蔽的房頂上張望适瓦。 院中可真熱鬧,春花似錦谱仪、人聲如沸犹菇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揭芍。三九已至,卻和暖如春卸例,著一層夾襖步出監(jiān)牢的瞬間称杨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工筷转, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留姑原,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓呜舒,卻偏偏與公主長得像锭汛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袭蝗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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

  • 初始化 目的是確保第一次使用之前某類型的新實例能夠正確初始化 為存儲屬性設(shè)置初始化值 類或者結(jié)構(gòu)體實例化時必須為所...
    labourer閱讀 667評論 0 0
  • 作者: Liwx 郵箱: 1032282633@qq.com 源碼: 需要源碼的同學(xué), 可以在評論區(qū)留下您的郵箱 ...
    Liwx閱讀 2,669評論 1 6
  • 官方文檔 初始化 Initialization是為準(zhǔn)備使用類到腥,結(jié)構(gòu)體或者枚舉實例的一個過程朵逝。這個過程涉及了在實例里...
    hrscy閱讀 1,133評論 0 1
  • 初始化 初始化是為類、結(jié)構(gòu)體或者枚舉準(zhǔn)備實例的過程乡范。這個過需要給實例里的每一個存儲屬性設(shè)置一個初始值并且在新實例可...
    SunshineBrother閱讀 405評論 0 1
  • Swift中類和子類的初始化有一定的規(guī)則配名,不是很容易理解啤咽,現(xiàn)在簡單梳理一下: 兩段式初始化( two-phase ...
    趙邦華閱讀 754評論 0 5