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

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

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

初始化器

required

用required修飾指定初始化器,表明其所有子類都必須實(shí)現(xiàn)該初始化器(通過繼承或者重寫實(shí)現(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)用可失敗初始化器需要進(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)用一個可失敗初始化器導(dǎo)致初始化失敗,那么整個初始化過程都失敗,并且之后的代碼都停止執(zhí)行

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

反初始化器(deinit)

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

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

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

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

父類的deinit能被子類繼承

子類的deinit實(shí)現(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?

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

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

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

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

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

形成可選鏈:

多個?可以鏈接在一起

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

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 實(shí)現(xiàn)短信驗(yàn)證碼倒計(jì)時功能

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

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

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

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

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

    這篇文章主要介紹了Swift中動態(tài)調(diào)用實(shí)例方法介紹,在Swift中有一類很有意思的寫法,可以讓我們不直接使用實(shí)例來調(diào)用這個實(shí)例上的方法,而是通過類型取出這個類型的某個實(shí)例方法的簽名,然后再通過傳遞實(shí)例來拿到實(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)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用SwiftUI具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-09-09
  • 深入理解Swift語言中的閉包機(jī)制

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

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

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

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

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

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

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

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

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

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

    Swift繪制漸變色的方法

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

最新評論

通化县| 南岸区| 威海市| 太康县| 沛县| 维西| 金沙县| 铜川市| 肇庆市| 黑河市| 崇阳县| 额敏县| 九江市| 尉犁县| 佛坪县| 红河县| 西乡县| 县级市| 镇巴县| 方城县| 城固县| 宜宾县| 汉寿县| 五指山市| 岫岩| 乌兰浩特市| 淳化县| 怀集县| 界首市| 同仁县| 商水县| 西乌| 台中县| 荃湾区| 亚东县| 西宁市| 沂水县| 调兵山市| 芷江| 黑山县| 新龙县|