Swift初始化器及可選鏈

初始化器

required

  • 用required修飾指定初始化器,表明其所有子類都必須實現(xiàn)該初始化器(通過繼承或者重寫實現(xiàn))

  • 如果子類重寫了required初始化器,也必須加上required从诲,不用加上override

class Person {
    required init() {}
    
    init(age: Int) {}
}

class Student: Person {
    init(no: Int) {
        super.init(age: 0)
    }
    
    required init() {
        super.init()
    }
}

屬性觀察器

  • 父類的屬性在它自己的初始化器中賦值不會觸發(fā)屬性觀察器,但在子類的初始化器中賦值會觸發(fā)屬性觀察器
class Person {
    var age: Int {
        willSet {
            print("willSet", newValue)
        }
        didSet {
            print("didSet", oldValue, age)
        }
    }
    
    init() {
        self.age = 0
    }
}

class Student: Person {
    override init() {
        super.init()
        self.age = 1
    }
}

可失敗初始化器

  • 類、結(jié)構體襟铭、枚舉都可以使用init?定義可失敗初始化器
class Person {
    var name: String
    
    init?(name: String) {
        if name.isEmpty {
            return nil
        }
        self.name = name
    }
}
  • 不允許同時定義參數(shù)標簽、參數(shù)個數(shù)短曾、參數(shù)類型相同的可失敗初始化器和非可失敗初始化器

  • 可以用init!定義隱式解包的可失敗初始化器

  • 可失敗初始化器可以調(diào)用非可失敗初始化器寒砖,非可失敗初始化器調(diào)用可失敗初始化器需要進行解包

class Person {
    var name: String
    
    init?(name: String) {
        if name.isEmpty {
            return nil
        }
        self.name = name
    }
    
    convenience init() {
        self.init(name: "")!
    }
}
  • 如果初始化器調(diào)用一個可失敗初始化器導致初始化失敗,那么整個初始化過程都失敗嫉拐,并且之后的代碼都停止執(zhí)行

  • 可以用一個非可失敗初始化器重寫一個可失敗初始化器哩都,但反過來是不行的。

反初始化器(deinit)

  • deinit叫做反初始化器婉徘,類似于C++的析構函數(shù)漠嵌、OC中的dealloc方法

      當類的實例對象被釋放內(nèi)存時,就會調(diào)用實例對象的deinit方法
    
class Person {
    deinit {
        print("Person對象銷毀了")
    }
}
  • deinit不接受任何參數(shù)盖呼,不能寫小括號儒鹿,不能自行調(diào)用

  • 父類的deinit能被子類繼承

  • 子類的deinit實現(xiàn)執(zhí)行完畢后會調(diào)用父類的deinit

可選鏈(Optional Chaining)

class Car {
    var price = 0
}

class Dog {
    var weight = 0
}

class Person {
    var name: String = ""
    var dog: Dog = Dog()
    var car: Car? = Car()
    
    func age() -> Int {
        18
    }
    
    func eat() {
        print("Person eat")
    }
    
    subscript(index: Int) -> Int {
        return index
    }
}

var person: Person? = Person()
var age = person?.age()//Int? Optional(18)
var age1 = person!.age() // Int
var name = person?.name //String?
var index = person?[6] // Int?
  • 如果可選項為nil,調(diào)用方法几晤、下標约炎、屬性失敗,結(jié)果為nil

  • 如果可選項不為nil蟹瘾,調(diào)用方法章钾、下標、屬性成功热芹,結(jié)果會被包裝成可選項

  • 如果結(jié)果本來就是可選項贱傀,不會進行再次包裝

判斷方法有沒有調(diào)用成功:

if let age = person?.age() { // ()?
    print("調(diào)用age成功", age)
} else {
    print("調(diào)用age失敗")
}

形成可選鏈:

  • 多個?可以鏈接在一起

如果鏈中任何一個節(jié)點是nil,那么整個鏈就會調(diào)用失敗伊脓,可選鏈應用的地方還是很多的府寒,在OC里面我們通常會加很多判斷以避免崩潰魁衙,在Swift里面,因為有了可選鏈會減少很多我們自己的判斷株搔,提高了安全性剖淀。

var dog = person?.dog // Dog?
var weight = person?.dog.weight // Int?
var price = person?.car?.price // Int?
var scores = [
    "Jack" : [86, 82, 84],
    "Rose" : [79, 94, 81]
]

scores["Jack"]?[0] = 100
scores["Rose"]?[2] += 10
scores["Kate"]?[0] = 88
var num1: Int? = 5
num1? = 10 // Optional(10)

var num2: Int? = nil
num2? = 10 // nil
var dict: [String : (Int, Int) -> Int] = [
    "sum" : (+), //兩個Int類型相加,返回一個Int類型
    "difference" : (-)
]

var result = dict["sum"]?(10, 20) // Optional(30), Int?
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纤房,一起剝皮案震驚了整個濱河市纵隔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炮姨,老刑警劉巖捌刮,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舒岸,居然都是意外死亡绅作,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門蛾派,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俄认,“玉大人,你說我怎么就攤上這事洪乍∶行樱” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵壳澳,是天一觀的道長役拴。 經(jīng)常有香客問我,道長钾埂,這世上最難降的妖魔是什么河闰? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮褥紫,結(jié)果婚禮上姜性,老公的妹妹穿的比我還像新娘。我一直安慰自己髓考,他們只是感情好部念,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氨菇,像睡著了一般儡炼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上查蓉,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天乌询,我揣著相機與錄音,去河邊找鬼豌研。 笑死妹田,一個胖子當著我的面吹牛唬党,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鬼佣,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼驶拱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晶衷?” 一聲冷哼從身側(cè)響起蓝纲,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晌纫,沒想到半個月后税迷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡缸匪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年翁狐,在試婚紗的時候發(fā)現(xiàn)自己被綠了类溢。 大學時的朋友給我發(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
  • 我被黑心中介騙來泰國打工政钟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劫乱,地道東北人织中。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像衷戈,于是被迫代替她去往敵國和親狭吼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

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