最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2022年08月24日 09:25:02   作者:撲騰的蛾子  
初始化器初始化是準(zhǔn)備類(lèi)、結(jié)構(gòu)或枚舉的實(shí)例以供使用的過(guò)程。此過(guò)程涉及為該實(shí)例上的每個(gè)存儲(chǔ)屬性設(shè)置初始值,并執(zhí)行在新實(shí)例準(zhǔn)備就緒可供使用之前所需的任何其他設(shè)置或初始化,可選鏈?zhǔn)且环N可以請(qǐng)求和調(diào)用屬性、方法和子腳本的過(guò)程,用于請(qǐng)求或調(diào)用的目標(biāo)可能為nil

初始化器

required

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

如果子類(lèi)重寫(xiě)了required初始化器,也必須加上required,不用加上override

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

屬性觀察器

父類(lèi)的屬性在它自己的初始化器中賦值不會(huì)觸發(fā)屬性觀察器,但在子類(lèi)的初始化器中賦值會(huì)觸發(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
    }
}

可失敗初始化器

類(lèi)、結(jié)構(gòu)體、枚舉都可以使用init?定義可失敗初始化器

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

不允許同時(shí)定義參數(shù)標(biāo)簽、參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型相同的可失敗初始化器和非可失敗初始化器

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

可失敗初始化器可以調(diào)用非可失敗初始化器,非可失敗初始化器調(diào)用可失敗初始化器需要進(jìn)行解包

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

如果初始化器調(diào)用一個(gè)可失敗初始化器導(dǎo)致初始化失敗,那么整個(gè)初始化過(guò)程都失敗,并且之后的代碼都停止執(zhí)行

可以用一個(gè)非可失敗初始化器重寫(xiě)一個(gè)可失敗初始化器,但反過(guò)來(lái)是不行的。

反初始化器(deinit)

deinit叫做反初始化器,類(lèi)似于C++的析構(gòu)函數(shù)、OC中的dealloc方法

當(dāng)類(lèi)的實(shí)例對(duì)象被釋放內(nèi)存時(shí),就會(huì)調(diào)用實(shí)例對(duì)象的deinit方法

class Person {
    deinit {
        print("Person對(duì)象銷(xiāo)毀了")
    }
}

deinit不接受任何參數(shù),不能寫(xiě)小括號(hào),不能自行調(diào)用

父類(lèi)的deinit能被子類(lèi)繼承

子類(lèi)的deinit實(shí)現(xiàn)執(zhí)行完畢后會(huì)調(diào)用父類(lèi)的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?

如果可選項(xiàng)為nil,調(diào)用方法、下標(biāo)、屬性失敗,結(jié)果為nil

如果可選項(xiàng)不為nil,調(diào)用方法、下標(biāo)、屬性成功,結(jié)果會(huì)被包裝成可選項(xiàng)

如果結(jié)果本來(lái)就是可選項(xiàng),不會(huì)進(jìn)行再次包裝

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

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

形成可選鏈:

多個(gè)?可以鏈接在一起

如果鏈中任何一個(gè)節(jié)點(diǎn)是nil,那么整個(gè)鏈就會(huì)調(diào)用失敗,可選鏈應(yīng)用的地方還是很多的,在OC里面我們通常會(huì)加很多判斷以避免崩潰,在Swift里面,因?yàn)橛辛丝蛇x鏈會(huì)減少很多我們自己的判斷,提高了安全性。

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" : (+), //兩個(gè)Int類(lèi)型相加,返回一個(gè)Int類(lèi)型
    "difference" : (-)
]
var result = dict["sum"]?(10, 20) // Optional(30), Int?

到此這篇關(guān)于Swift初始化器與可選鏈的使用方法介紹的文章就介紹到這了,更多相關(guān)Swift初始化器與可選鏈內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • swift 3.0 實(shí)現(xiàn)短信驗(yàn)證碼倒計(jì)時(shí)功能

    swift 3.0 實(shí)現(xiàn)短信驗(yàn)證碼倒計(jì)時(shí)功能

    這篇文章主要介紹了swift 3.0 實(shí)現(xiàn)短信驗(yàn)證碼倒計(jì)時(shí)功能的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Swift實(shí)現(xiàn)3D輪播圖效果

    Swift實(shí)現(xiàn)3D輪播圖效果

    這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)3D輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Swift中動(dòng)態(tài)調(diào)用實(shí)例方法介紹

    Swift中動(dòng)態(tài)調(diào)用實(shí)例方法介紹

    這篇文章主要介紹了Swift中動(dòng)態(tài)調(diào)用實(shí)例方法介紹,在Swift中有一類(lèi)很有意思的寫(xiě)法,可以讓我們不直接使用實(shí)例來(lái)調(diào)用這個(gè)實(shí)例上的方法,而是通過(guò)類(lèi)型取出這個(gè)類(lèi)型的某個(gè)實(shí)例方法的簽名,然后再通過(guò)傳遞實(shí)例來(lái)拿到實(shí)際需要調(diào)用的方法,需要的朋友可以參考下
    2015-01-01
  • 如何利用SwiftUI實(shí)現(xiàn)可縮放的圖片預(yù)覽器

    如何利用SwiftUI實(shí)現(xiàn)可縮放的圖片預(yù)覽器

    這篇文章主要給大家介紹了關(guān)于如何利用SwiftUI實(shí)現(xiàn)可縮放圖片預(yù)覽器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SwiftUI具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 深入理解Swift語(yǔ)言中的閉包機(jī)制

    深入理解Swift語(yǔ)言中的閉包機(jī)制

    這篇文章主要介紹了Swift語(yǔ)言中的閉包機(jī)制,是Swift入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • 詳解Swift中的數(shù)據(jù)類(lèi)型類(lèi)型轉(zhuǎn)換

    詳解Swift中的數(shù)據(jù)類(lèi)型類(lèi)型轉(zhuǎn)換

    Swift中的類(lèi)型轉(zhuǎn)換可以結(jié)合類(lèi)的繼承等面向?qū)ο蟮木幊烫匦詠?lái)進(jìn)行,本文中我們就來(lái)詳解Swift中的數(shù)據(jù)類(lèi)型類(lèi)型轉(zhuǎn)換,需要的朋友可以參考下
    2016-07-07
  • 詳細(xì)講解Swift中的類(lèi)型占位符

    詳細(xì)講解Swift中的類(lèi)型占位符

    類(lèi)型占位符是swift5.6中引?的?個(gè)新功能,在處理稍微復(fù)雜的通?類(lèi)型時(shí),它可能真的很有用,這篇文章主要給大家介紹了關(guān)于Swift類(lèi)型占位符的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • 詳解Swift面向?qū)ο缶幊讨械姆椒?method)

    詳解Swift面向?qū)ο缶幊讨械姆椒?method)

    既然面向?qū)ο竽蔷鸵欢〞?huì)有method,方法和面向過(guò)程語(yǔ)言中的function函數(shù)并沒(méi)什么區(qū)別,只不過(guò)方法在面向?qū)ο笳Z(yǔ)言中可以被類(lèi)來(lái)約束作用域,這里我們就來(lái)詳解Swift面向?qū)ο缶幊讨械姆椒?method)
    2016-07-07
  • 深入理解swift變量和函數(shù)

    深入理解swift變量和函數(shù)

    Swift 函數(shù)用來(lái)完成特定任務(wù)的獨(dú)立的代碼塊。這篇文章主要介紹了swift變量和函數(shù)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • Swift繪制漸變色的方法

    Swift繪制漸變色的方法

    這篇文章主要為大家詳細(xì)介紹了Swift繪制漸變色的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論

营口市| 平遥县| 武宁县| 湖北省| 勐海县| 长白| 麻栗坡县| 游戏| 锡林浩特市| 象州县| 宜宾市| 三台县| 津南区| 清新县| 建水县| 德令哈市| 荔浦县| 武冈市| 景泰县| 昆山市| 嵊泗县| 安福县| 凤山市| 浑源县| 平陆县| 罗平县| 天柱县| 淅川县| 沽源县| 永川市| 文山县| 朝阳县| 深泽县| 天气| 正阳县| 库尔勒市| 安宁市| 盐城市| 奉化市| 尼玛县| 长治县|