Swift基礎(chǔ)語法-可選鏈


1. 可選連的概念

  • 可選鏈:有多個(gè)可選類型組成的一個(gè)鏈條被稱之為可選鏈
  • 它的可選性體現(xiàn)于請(qǐng)求或調(diào)用的目標(biāo)當(dāng)前可能為空(nil)
    • 如果可選的目標(biāo)有值,那么調(diào)用就會(huì)成功;
    • 如果選擇的目標(biāo)為空(nil),則這種調(diào)用將返回空(nil)
  • 多次調(diào)用被鏈接在一起形成一個(gè)鏈,如果任何一個(gè)節(jié)點(diǎn)為空(nil)將導(dǎo)致整個(gè)鏈?zhǔn)А?/li>
  • 在可選類型后面放一個(gè)問號(hào),可以定義一個(gè)可選鏈。
  • 這一點(diǎn)很像在可選值后面放一個(gè)嘆號(hào)!來強(qiáng)制拆得其封包內(nèi)的值
    • 它們的主要的區(qū)別在于當(dāng)可選值為空時(shí)可選鏈即刻失敗
    • 然而一般的強(qiáng)制解析將會(huì)引發(fā)運(yùn)行時(shí)錯(cuò)誤。
  • 因?yàn)榭蛇x鏈的結(jié)果可能為nil,可能有值.因此它的返回值是一個(gè)可選類型.
    • 可以通過判斷返回是否有值來判斷是否調(diào)用成功
    • 有值,說明調(diào)用成功
    • 為nil,說明調(diào)用失敗

2. 可選鏈的使用

  • 示例描述: 人(Person)有一個(gè)狗(Dog),狗(Dog)有一個(gè)玩具(Toy),玩具有價(jià)格(price)
  • 使用代碼描述上述信息
// 1.定義了三個(gè)類
class Person {
    var name : String = ""
    var dog : Dog?
}

class Dog {
    var dogName : String = ""
    var toy : Toy?
}

class Toy {
    var price : Double = 0.0
    func flying() {
        print("飛盤正在flying")
    }
}

// 2.創(chuàng)建三個(gè)對(duì)象
let p = Person()
p.name = "cdh"

let dog = Dog()
dog.dogName = "旺財(cái)"

let toy = Toy()
toy.price = 100

// 3.讓對(duì)象之間產(chǎn)生關(guān)系(cdh擁有一個(gè)叫旺財(cái)?shù)墓?這個(gè)狗有一個(gè)100塊錢的玩具)
p.dog = dog
dog.toy = toy
2.1 從可選鏈中取值
  • 需求:獲取(cdh的旺財(cái)狗的玩具的價(jià)格)
    • 取出的值為可選類型,因?yàn)榭蛇x鏈中有一個(gè)可選類型為nil,則返回nil
    • 因此結(jié)果可能有值,可能為nil.因此是一個(gè)可選類型
// 4.獲取(cdh的旺財(cái)狗的玩具的價(jià)格)
// 以下寫法非常復(fù)雜, 需要多次 if 判斷, 因此推出可選鏈
if let cdhDog = p.dog {
    if let toy = cdhDog.toy {
        let price = toy.price
    }
}
// let price = p.dog!.toy!.price  // ?強(qiáng)制解包非常危險(xiǎn)
// 可選鏈:有多個(gè)可選類型組成的一個(gè)鏈條被稱之為可選鏈
// 在可選鏈中取值的過程中,編譯器會(huì)自動(dòng)判斷每一個(gè)可選類型是否有值,
// 如果可選類型有值,那么系統(tǒng)會(huì)對(duì)該可選類型進(jìn)行解包. 
// 如果發(fā)現(xiàn)可選類型沒有值,那么系統(tǒng)會(huì)自動(dòng)返回nil
let price = person.dog?.toy?.price
print(price) // Optional(100.0)\n
2.2 給可選鏈賦值
  • 1.判斷所有的可選類型是否有值,如果都沒有值,則該語句相當(dāng)于沒有執(zhí)行
  • 2.如果所有的可選類型都有值,則系統(tǒng)會(huì)自動(dòng)給可選類型進(jìn)行解包,解包之后,在進(jìn)行賦值
  • 需求:給大黃一個(gè)新的玩具
//5.給可選鏈賦值
// 一般寫法
if let cdhDog = p.dog {
    if let toy = cdhDog.toy {
        toy.price = 50
    }
}
//強(qiáng)制解包的寫法
// p.dog!.toy!.price = 50 
// 可選鏈賦值
p.dog?.toy?.price = 50
2.3 調(diào)用可選鏈中的方法
  • 如果可選類型有值,則會(huì)執(zhí)行該方法
  • 如果可選類型為nil,則該方法不會(huì)執(zhí)行
// 一般寫法
if let cdhDog = p.dog {
    if let toy = cdhDog.toy {
        toy.flying()
    }
}
// 強(qiáng)制解包寫法
// p.dog!.toy!.flying()
// 可選鏈寫法
p.dog?.toy?.flying()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容