swift 4.x 可選類(lèi)型

有時(shí)可能會(huì)存在“值缺失”的情況他去,比如數(shù)據(jù)類(lèi)型相互轉(zhuǎn)換時(shí)轉(zhuǎn)換失敗。
“值缺失”用nil表示倒堕。

Int("123")
Int("123abc")

為了處理可能存在“值缺失”的情況灾测,Swift引入了可選類(lèi)型。
在聲明任何數(shù)據(jù)類(lèi)型的變量或常量時(shí)垦巴,都可以在數(shù)據(jù)類(lèi)型的后面添加一個(gè)問(wèn)號(hào)媳搪?,這樣骤宣,聲明的變量或常量就是可選類(lèi)型的蛾号。
可選類(lèi)型的變量或常量有兩種情況:要么有值,但是該值被包裝起來(lái)了涯雅;要么沒(méi)有值鲜结,用nil表示。

var i: Int?

i = Int("123")
print(i)

i = Int("123abc")
print(i)

/*
 對(duì)于可選的變量或常量,其默認(rèn)值是nil精刷。
 */
var b: Bool?


/*
 nil只能被賦值給可選類(lèi)型的變量或常量拗胜,不能被賦值給普通的變量或常量。
 */
var d: Double? = nil

// var d2 = nil


/*
 可以使用比較運(yùn)算符==或!=把一個(gè)可選類(lèi)型的變量或常量和nil作比較怒允,以判斷該變量或常量是否是有值的埂软。
 */
d = 1.8

if d != nil {
    print("d是有值的")
}

2.可選類(lèi)型的解包之強(qiáng)制解包

對(duì)于可選類(lèi)型的變量或常量,如果想要訪(fǎng)問(wèn)其包裝的實(shí)際值纫事,可以在變量或常量的后面添加感嘆號(hào)!進(jìn)行強(qiáng)制解包勘畔。

var i: Int?

i = Int("123")
print(i!)


var f1: Float? = 1.8
var f2: Float? = 1.5
var f3: Float? = 1.6

print((f1! + f2! + f3!) / 3)

對(duì)nil進(jìn)行強(qiáng)制解包會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。因此丽惶,在對(duì)可選類(lèi)型的變量或常量進(jìn)行強(qiáng)制解包時(shí)要進(jìn)行判斷炫七。

i = Int("123abc")

// print(i!)

if i != nil {
    print(i!)
}

f3 = nil

// print((f1! + f2! + f3!) / 3)

if f1 != nil && f2 != nil && f3 != nil {
    print((f1! + f2! + f3!) / 3)
}

3. 可選類(lèi)型的解包之可選綁定

對(duì)于可選類(lèi)型的變量或常量,如果想要訪(fǎng)問(wèn)其包裝的實(shí)際值钾唬,除了強(qiáng)制解包外万哪,還可以使用可選綁定。

  • 可選綁定的語(yǔ)法格式為:
    if var或let 臨時(shí)的變量或常量 = 可選類(lèi)型的變量或常量 {
    條件執(zhí)行語(yǔ)句
    }

以上語(yǔ)句相當(dāng)于:
if 可選類(lèi)型的變量或常量 != nil {
var或let 臨時(shí)的變量或常量 = 對(duì)可選類(lèi)型的變量或常量進(jìn)行解包得到的實(shí)際值
條件執(zhí)行語(yǔ)句
}

  • 對(duì)于可選類(lèi)型的變量或常量抡秆,如果想要訪(fǎng)問(wèn)器包裝的實(shí)際值奕巍,推薦使用可選綁定而不是強(qiáng)制解包,因?yàn)閺?qiáng)制解包可能會(huì)因?yàn)楸粡?qiáng)制解包的變量或常量的值是nil而導(dǎo)致運(yùn)行時(shí)錯(cuò)誤儒士。
var i: Int?

i = Int("123")
// i = Int("123abc")

if let actualI = i {
    print(actualI)
} else {
    print("轉(zhuǎn)換失敗")
}

// 以上語(yǔ)句相當(dāng)于:
if i != nil {
    let actualI = i!
    print(actualI)
} else {
    print("轉(zhuǎn)換失敗")
}

/*
 在可選綁定的if語(yǔ)句中創(chuàng)建的臨時(shí)變量或常量的止,其作用域僅僅存在于if語(yǔ)句中。
 */
// print(actualI)

在可選綁定的if語(yǔ)句中着撩,可以同時(shí)使用多個(gè)可選的綁定和判斷條件冲杀,并用逗號(hào)進(jìn)行分隔。
只要其中一個(gè)可選綁定的值為nil睹酌,或其中一個(gè)判斷條件的值為false权谁,那么整個(gè)if語(yǔ)句的判斷結(jié)果就為false。

var f1: Float? = 1.8
var f2: Float? = 1.5
var f3: Float? = 1.6

// f3 = nil

if let actualF1 = f1, let actualF2 = f2, let actualF3 = f3 {
    print((actualF1 + actualF2 + actualF3) / 3)
} else {
    print("計(jì)算失敱镅亍旺芽!")
}

// 上面的語(yǔ)句等價(jià)于:
if let actualF1 = f1 {
    if let actualF2 = f2 {
        if let actualF3 = f3 {
            print((actualF1 + actualF2 + actualF3) / 3)
        } else {
            print("計(jì)算失敗辐啄!")
        }
    } else {
        print("計(jì)算失敳烧隆!")
    }
} else {
    print("計(jì)算失敽肌悯舟!")
}

if let firstNumber = Int("16"), let secondNumber = Int("18"), firstNumber < secondNumber && secondNumber < 13 {
    print("\(firstNumber) < \(secondNumber) < 20")
}

// 上面的語(yǔ)句等價(jià)于:
if let firstNumber = Int("16") {
    if let secondNumber = Int("18") {
        if firstNumber < secondNumber && secondNumber < 20 {
            print("\(firstNumber) < \(secondNumber) < 20")
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市砸民,隨后出現(xiàn)的幾起案子抵怎,更是在濱河造成了極大的恐慌奋救,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件反惕,死亡現(xiàn)場(chǎng)離奇詭異尝艘,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)姿染,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)背亥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人悬赏,你說(shuō)我怎么就攤上這事狡汉。” “怎么了闽颇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵盾戴,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我进萄,道長(zhǎng)捻脖,這世上最難降的妖魔是什么锐峭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任中鼠,我火速辦了婚禮,結(jié)果婚禮上沿癞,老公的妹妹穿的比我還像新娘援雇。我一直安慰自己,他們只是感情好椎扬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布惫搏。 她就那樣靜靜地躺著,像睡著了一般蚕涤。 火紅的嫁衣襯著肌膚如雪筐赔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天揖铜,我揣著相機(jī)與錄音茴丰,去河邊找鬼。 笑死天吓,一個(gè)胖子當(dāng)著我的面吹牛贿肩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播龄寞,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼汰规,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了物邑?” 一聲冷哼從身側(cè)響起溜哮,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤滔金,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后茬射,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鹦蠕,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年在抛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钟病。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刚梭,死狀恐怖肠阱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情朴读,我是刑警寧澤屹徘,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站衅金,受9級(jí)特大地震影響噪伊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氮唯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一鉴吹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惩琉,春花似錦豆励、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至伍玖,卻和暖如春嫩痰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窍箍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工串纺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仔燕。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓造垛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親晰搀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子五辽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容