日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Swift初始化器與可選鏈的使用方法介紹_Swift

作者:撲騰的蛾子 ? 更新時間: 2022-10-20 編程語言

初始化器

required

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

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

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

屬性觀察器

父類的屬性在它自己的初始化器中賦值不會觸發屬性觀察器,但在子類的初始化器中賦值會觸發屬性觀察器

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
    }
}

可失敗初始化器

類、結構體、枚舉都可以使用init?定義可失敗初始化器

class Person {
    var name: String
    init?(name: String) {
        if name.isEmpty {
            return nil
        }
        self.name = name
    }
}

不允許同時定義參數標簽、參數個數、參數類型相同的可失敗初始化器和非可失敗初始化器

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

可失敗初始化器可以調用非可失敗初始化器,非可失敗初始化器調用可失敗初始化器需要進行解包

class Person {
    var name: String
    init?(name: String) {
        if name.isEmpty {
            return nil
        }
        self.name = name
    }
    convenience init() {
        self.init(name: "")!
    }
}

如果初始化器調用一個可失敗初始化器導致初始化失敗,那么整個初始化過程都失敗,并且之后的代碼都停止執行

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

反初始化器(deinit)

deinit叫做反初始化器,類似于C++的析構函數、OC中的dealloc方法

當類的實例對象被釋放內存時,就會調用實例對象的deinit方法

class Person {
    deinit {
        print("Person對象銷毀了")
    }
}

deinit不接受任何參數,不能寫小括號,不能自行調用

父類的deinit能被子類繼承

子類的deinit實現執行完畢后會調用父類的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,調用方法、下標、屬性失敗,結果為nil

如果可選項不為nil,調用方法、下標、屬性成功,結果會被包裝成可選項

如果結果本來就是可選項,不會進行再次包裝

判斷方法有沒有調用成功:

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

形成可選鏈:

多個?可以鏈接在一起

如果鏈中任何一個節點是nil,那么整個鏈就會調用失敗,可選鏈應用的地方還是很多的,在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?

原文鏈接:https://blog.csdn.net/run_in_road/article/details/125960726

欄目分類
最近更新