Swift學(xué)習(xí)-可選(Optionals)類型與解析(來源:菜鳥教程)

可選(Optionals)類型

Swift 的可選(Optional)類型沐旨,用于處理值缺失的情況森逮。可選表示"那兒有一個(gè)值磁携,并且它等于 x "或者"那兒沒有值"。
Swfit語言定義后綴良风?作為命名類型Optional的簡(jiǎn)寫谊迄,換句話說闷供,以下兩種聲明是相等的:

var optionalInteger: Int?
var optionalInteger: Optional<Int>

在這兩種情況下,變量 optionalInteger 都是可選整數(shù)類型统诺。注意歪脏,在類型和 ?之間沒有空格。
Optional 是一個(gè)含有兩種情況的枚舉粮呢,None 和 Some(T)婿失,用來表示可能有或可能沒有值。任何類型都可以明確聲明為(或者隱式轉(zhuǎn)換)可選類型啄寡。當(dāng)聲明一個(gè)可選類型的時(shí)候豪硅,要確保用括號(hào)給 ? 操作符一個(gè)合適的范圍。例如挺物,聲明可選整數(shù)數(shù)組懒浮,應(yīng)該寫成 (Int[])? 寫成 Int[]? 會(huì)報(bào)錯(cuò)。

當(dāng)你聲明一個(gè)可選變量或者可選屬性的時(shí)候沒有提供初始值识藤,它的值會(huì)默認(rèn)為 nil砚著。
可選項(xiàng)遵照 LogicValue 協(xié)議,因此可以出現(xiàn)在布爾環(huán)境中痴昧。在這種情況下稽穆,如果可選類型T?包含類型為T的任何值(也就是說它的值是 Optional.Some(T) ),這個(gè)可選類型等于 true赶撰,反之為 false舌镶。
如果一個(gè)可選類型的實(shí)例包含一個(gè)值,你可以用后綴操作符 扣囊!來訪問這個(gè)值乎折,如下所示:

optionalInteger = 42
optionalInteger! // 42

使用操作符!去獲取值為nil的可選變量會(huì)有運(yùn)行時(shí)錯(cuò)誤侵歇。
你可以用可選鏈接和可選綁定選擇性執(zhí)行可選表達(dá)式上的操作骂澄。如果值為nil,任何操作都不會(huì)執(zhí)行惕虑,也不會(huì)有運(yùn)行報(bào)錯(cuò)坟冲。
讓我們來詳細(xì)看下以下實(shí)例來了解 Swift 中可選類型的應(yīng)用:

import Cocoa

var myString:String? = nil

if myString != nil {
    print(myString)
}else{
    print("字符串為 nil")
}

以上程序執(zhí)行結(jié)果為:

字符串為 nil

可選類型類似于Objective-C中指針的nil值,但是nil只對(duì)類(class)有用溃蔫,而可選類型對(duì)所有的類型都可用健提,并且更安全。

強(qiáng)制解析

當(dāng)你確定可選類型確實(shí)包含值之后伟叛,你可以在可選的名字后面加一個(gè)感嘆號(hào)(!)來獲取值私痹。這個(gè)感嘆號(hào)表示"我知道這個(gè)可選有值,請(qǐng)使用它。"這被稱為可選值的強(qiáng)制解析(forced unwrapping)紊遵。
實(shí)例如下:

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if myString != nil {
   print(myString)
}else{
   print("myString 值為 nil")
}

以上程序執(zhí)行結(jié)果為:

Optional("Hello, Swift!")

強(qiáng)制解析可選值账千,使用感嘆號(hào)(!):

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if myString != nil {
   // 強(qiáng)制解析
   print( myString! )
}else{
   print("myString 值為 nil")
}

以上程序執(zhí)行結(jié)果為:

Hello, Swift!
注意:
使用!來獲取一個(gè)不存在的可選值會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。使用!來強(qiáng)制解析值之前暗膜,一定要確定可選包含一個(gè)非nil的值匀奏。

自動(dòng)解析

你可以在聲明可選變量時(shí)使用感嘆號(hào)(!)替換問號(hào)(?)。這樣可選變量在使用時(shí)就不需要再加一個(gè)感嘆號(hào)(!)來獲取值学搜,它會(huì)自動(dòng)解析娃善。
實(shí)例如下:

import Cocoa

var myString:String!

myString = "Hello, Swift!"

if myString != nil {
   print(myString)
}else{
   print("myString 值為 nil")
}

以上程序執(zhí)行結(jié)果為:

Hello, Swift!

可選綁定(重點(diǎn))

使用可選綁定(optional binding)來判斷可選類型是否包含值,如果包含就把值賦給一個(gè)臨時(shí)常量或者變量瑞佩【刍牵可選綁定可以用在if和while語句中來對(duì)可選類型的值進(jìn)行判斷并把值賦給一個(gè)常量或者變量。
像下面這樣在if語句中寫一個(gè)可選綁定:

if let constantName = someOptional {
    statements
}

讓我們來看下一個(gè)簡(jiǎn)單的可選綁定實(shí)例:

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if let yourString = myString {
   print("你的字符串值為 - \(yourString)")
}else{
   print("你的字符串沒有值")
}

以上程序執(zhí)行結(jié)果為:

你的字符串值為 - Hello, Swift!

特別聲明:本來來源于菜鳥教程(因?yàn)閷W(xué)習(xí)記錄一下)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钉凌,一起剝皮案震驚了整個(gè)濱河市咧最,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌御雕,老刑警劉巖矢沿,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異酸纲,居然都是意外死亡捣鲸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門闽坡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栽惶,“玉大人,你說我怎么就攤上這事疾嗅⊥獬В” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵代承,是天一觀的道長(zhǎng)汁蝶。 經(jīng)常有香客問我,道長(zhǎng)论悴,這世上最難降的妖魔是什么掖棉? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮膀估,結(jié)果婚禮上幔亥,老公的妹妹穿的比我還像新娘。我一直安慰自己察纯,他們只是感情好帕棉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布针肥。 她就那樣靜靜地躺著,像睡著了一般笤昨。 火紅的嫁衣襯著肌膚如雪祖驱。 梳的紋絲不亂的頭發(fā)上握恳,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天瞒窒,我揣著相機(jī)與錄音,去河邊找鬼乡洼。 笑死崇裁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的束昵。 我是一名探鬼主播拔稳,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼锹雏!你這毒婦竟也來了巴比?” 一聲冷哼從身側(cè)響起礁遵,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤政勃,失蹤者是張志新(化名)和其女友劉穎奸远,沒想到半個(gè)月后懒叛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薛窥,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拆檬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逝钥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖益眉,靈堂內(nèi)的尸體忽然破棺而出郭脂,到底是詐尸還是另有隱情展鸡,我是刑警寧澤埃难,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布忍弛,位于F島的核電站剧罩,受9級(jí)特大地震影響惠昔,放射性物質(zhì)發(fā)生泄漏镇防。R本人自食惡果不足惜来氧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一香拉、第九天 我趴在偏房一處隱蔽的房頂上張望凫碌。 院中可真熱鬧盛险,春花似錦勋又、人聲如沸楔壤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疲眷。三九已至狂丝,卻和暖如春哗总,著一層夾襖步出監(jiān)牢的瞬間讯屈,已是汗流浹背涮母。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工沪蓬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跷叉,地道東北人云挟。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓园欣,卻偏偏與公主長(zhǎng)得像峭拘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搬男,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355