亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

屬性觀察器

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

可失敗初始化器

類、結(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ù)類型相同的可失敗初始化器和非可失敗初始化器

可以用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è)初始化過程都失敗,并且之后的代碼都停止執(zhí)行

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

反初始化器(deinit)

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

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

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

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

父類的deinit能被子類繼承

子類的deinit實(shí)現(xiàn)執(zhí)行完畢后會(huì)調(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é)果會(huì)被包裝成可選項(xiàng)

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

判斷方法有沒有調(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類型相加,返回一個(gè)Int類型
    "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流程控制之循環(huán)語句和判斷語句詳解

    Swift流程控制之循環(huán)語句和判斷語句詳解

    這篇文章主要介紹了Swift流程控制之循環(huán)語句和判斷語句詳解,文中還使用了一個(gè)游戲例子來講解循環(huán)語句和判斷語句的使用,需要的朋友可以參考下
    2014-07-07
  • Swift 3.1聊天界面鍵盤效果的實(shí)現(xiàn)詳解

    Swift 3.1聊天界面鍵盤效果的實(shí)現(xiàn)詳解

    這篇文章主要給大家介紹了Swift 3.1聊天界面鍵盤效果實(shí)現(xiàn)的相關(guān)資料,文中介紹的非常詳細(xì),相信對(duì)大家的學(xué)習(xí)或者工作具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。
    2017-04-04
  • Swift編程中實(shí)現(xiàn)希爾排序算法的代碼實(shí)例

    Swift編程中實(shí)現(xiàn)希爾排序算法的代碼實(shí)例

    希爾排序是對(duì)插入排序的一種改進(jìn)版本,算法本身并不穩(wěn)定,存在優(yōu)化空間,這里我們來講一下希爾排序的大體思路及Swift編程中實(shí)現(xiàn)希爾排序算法的代碼實(shí)例
    2016-07-07
  • 分析Swift性能高效的原因

    分析Swift性能高效的原因

    絕大多數(shù)公司選擇Swift語言開發(fā)iOS應(yīng)用,主要原因是因?yàn)镾wift相比Objc有更快的運(yùn)行效率,更加安全的類型檢測(cè),更多現(xiàn)代語言的特性提升開發(fā)效率;這一系列的優(yōu)點(diǎn)使Swift語言的熱度越來越高。
    2020-10-10
  • 利用Swift實(shí)現(xiàn)一個(gè)響應(yīng)式編程庫(kù)

    利用Swift實(shí)現(xiàn)一個(gè)響應(yīng)式編程庫(kù)

    最近在學(xué)習(xí)swift,最近有空所以總結(jié)一下最近學(xué)習(xí)的內(nèi)容,下面這篇文章主要給大家介紹了關(guān)于利用Swift實(shí)現(xiàn)一個(gè)響應(yīng)式編程庫(kù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12
  • R.swift的使用與安裝教程

    R.swift的使用與安裝教程

    這篇文章主要給大家介紹了關(guān)于R.swift使用與安裝的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Swift 3.0基礎(chǔ)學(xué)習(xí)之下標(biāo)

    Swift 3.0基礎(chǔ)學(xué)習(xí)之下標(biāo)

    這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之下標(biāo)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用swift具有一定的參考價(jià)值,需要的朋友下面來一起看看吧。
    2017-03-03
  • Swift中defer的正確使用方法

    Swift中defer的正確使用方法

    準(zhǔn)備把 swift 文檔再掃一遍,發(fā)現(xiàn)了defer這個(gè)關(guān)鍵字,所以下面這篇文章主要給大家介紹了關(guān)于Swift中defer的正確使用方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-11-11
  • swift實(shí)現(xiàn)自動(dòng)輪播圖效果(UIScrollView+UIPageControl+Timer)

    swift實(shí)現(xiàn)自動(dòng)輪播圖效果(UIScrollView+UIPageControl+Timer)

    這篇文章主要為大家詳細(xì)介紹了swift實(shí)現(xiàn)自動(dòng)輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Swift4.1轉(zhuǎn)場(chǎng)動(dòng)畫實(shí)現(xiàn)側(cè)滑抽屜效果

    Swift4.1轉(zhuǎn)場(chǎng)動(dòng)畫實(shí)現(xiàn)側(cè)滑抽屜效果

    這篇文章主要為大家詳細(xì)介紹了Swift4.1轉(zhuǎn)場(chǎng)動(dòng)畫實(shí)現(xiàn)側(cè)滑抽屜效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06

最新評(píng)論