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é)構(gòu)體、枚舉都可以使用init?定義可失敗初始化器
class Person { var name: String init?(name: String) { if name.isEmpty { return nil } self.name = name } }
不允許同時定義參數(shù)標(biāo)簽、參數(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)用一個可失敗初始化器導(dǎo)致初始化失敗,那么整個初始化過程都失敗,并且之后的代碼都停止執(zhí)行
可以用一個非可失敗初始化器重寫一個可失敗初始化器,但反過來是不行的。
反初始化器(deinit)
deinit叫做反初始化器,類似于C++的析構(gòu)函數(shù)、OC中的dealloc方法
當(dāng)類的實例對象被釋放內(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)用方法、下標(biāo)、屬性失敗,結(jié)果為nil
如果可選項不為nil,調(diào)用方法、下標(biāo)、屬性成功,結(jié)果會被包裝成可選項
如果結(jié)果本來就是可選項,不會進行再次包裝
判斷方法有沒有調(diào)用成功:
if let age = person?.age() { // ()? print("調(diào)用age成功", age) } else { print("調(diào)用age失敗") }
形成可選鏈:
多個?可以鏈接在一起
如果鏈中任何一個節(jié)點是nil,那么整個鏈就會調(diào)用失敗,可選鏈應(yīng)用的地方還是很多的,在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?
到此這篇關(guān)于Swift初始化器與可選鏈的使用方法介紹的文章就介紹到這了,更多相關(guān)Swift初始化器與可選鏈內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Swift 3.0基礎(chǔ)學(xué)習(xí)之下標(biāo)
這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之下標(biāo)的相關(guān)資料,文中介紹的非常詳細,對大家學(xué)習(xí)或者使用swift具有一定的參考價值,需要的朋友下面來一起看看吧。2017-03-03swift實現(xiàn)自動輪播圖效果(UIScrollView+UIPageControl+Timer)
這篇文章主要為大家詳細介紹了swift實現(xiàn)自動輪播圖效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09Swift4.1轉(zhuǎn)場動畫實現(xiàn)側(cè)滑抽屜效果
這篇文章主要為大家詳細介紹了Swift4.1轉(zhuǎn)場動畫實現(xiàn)側(cè)滑抽屜效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06