Swift中??雙問號(hào)强戴,?問號(hào)亭螟!感嘆號(hào)分別代表什么意思

Swift 提供了雙問號(hào)操作符(??),英文叫 Double Question Mark骑歹≡だ樱可以用來快速對(duì) nil 進(jìn)行條件判斷。當(dāng)我們獲取一個(gè)可選值(optional value)時(shí)道媚,如果希望其為 nil 的情況下返回一個(gè)非 nil 值扁掸,那么就可以把這個(gè)返回值放在 ?? 后面。下面演示幾個(gè)常見的使用場(chǎng)景最域。

1谴分,可選值不為nil則使用可選值,為nil則使用默認(rèn)值

比如我們把 userName 這個(gè)參數(shù)值顯示在 label 中羡宙,但希望 userName 如果為 nil 的話便顯示"未知用戶"狸剃。

這個(gè)我們可以使用三元條件運(yùn)算來實(shí)現(xiàn):

`var` `userName:``String``?`

`self``.label.text = userName != ``nil` `? userName : ``"未知用戶"`

但使用雙問號(hào)操作符會(huì)更加簡(jiǎn)單:


`var` `userName:``String``?`

`self``.label.text = userName ?? ``"未知用戶"`

2掐隐,as? 類型轉(zhuǎn)換后處理nil值


`let` `message = json[``"message"``] ``as``? ``String` `?? ``"no message"`

swift中狗热?和钞馁!的出現(xiàn),歸根結(jié)底的原因匿刮,我認(rèn)為是swift在設(shè)計(jì)時(shí)引入的一個(gè)重要概念僧凰,就是所有的變量必須初始化,如果不初始化熟丸,就無法通過編譯器的檢查训措。這么做的好處就是從一開始就規(guī)避了因?yàn)樽兞课闯跏蓟瘜?dǎo)致的一些奇奇怪怪的bug。下面代碼展示了在使用一個(gè)未初始化的變量時(shí)光羞,編譯器報(bào)出的錯(cuò)誤绩鸣。

var variable:Int
print(variable)
//Variable 'variable' used before being initialized

1.可選類型

swift默認(rèn)要求所有變量必須初始化,但是開發(fā)過程中纱兑,或許會(huì)遇到一些對(duì)象的成員變量或者其他變量呀闻,并不會(huì)用到,也沒有必要初始化潜慎。這時(shí)就用到了swift為我們提供的可選類型捡多,就是表示程序員知道變量必須初始化,但是根據(jù)程序邏輯铐炫,程序員認(rèn)為不是一定要初始化該變量垒手。例如上面的例子,可以寫成如下:

var variable:Int?
print(variable)
//nil
或者不用”?”用”O(jiān)ptional”關(guān)鍵字

var variable:Optional
print(variable)
//nil

聲明為可選類型之后倒信,編譯就可以通過了科贬,因?yàn)槭浅绦騿T手動(dòng)聲明為可選類型,說明程序員已經(jīng)了解了該變量可能并不會(huì)初始化鳖悠,程序員可以對(duì)該變量負(fù)責(zé)唆迁。

下面說一下這個(gè)”nil”,可選類型不初始化的情況下竞穷,變量的值為nil唐责,這個(gè)nil和Objective-C中的nil并不相同,從一些swift語言的學(xué)習(xí)書籍中找到了下面的說明:

  • 在Objective-C中nil表示的是一個(gè)指向不存在對(duì)象的指針瘾带,而swift中表示空的關(guān)鍵字為”nil”鼠哥,它沒有其他含義。
  • 可選類型的變量或者常量在有值的時(shí)候返回值看政,沒有值的時(shí)候不會(huì)返回任何東西朴恳,包括false。
  • nil不能用于非可選的變量或者常量允蚣,如果你的代碼中可能會(huì)出現(xiàn)沒有值的情況于颖,請(qǐng)務(wù)必聲明其為可選類型,如果你聲明了一個(gè)可選變量或者常量沒有初始化嚷兔,程序會(huì)默認(rèn)賦值為nil

1.1可選鏈森渐,可選鏈就是將可選的調(diào)用鏈接在一起形成一個(gè)鏈做入,如果任何一個(gè)節(jié)點(diǎn)為空(nil),將導(dǎo)致整個(gè)可選鏈?zhǔn)隆R娙缦率纠?/p>

class Student {
    var country:Country?
}

class Country {
    var name:String = "China"
    var capital:Capital?
}

class Capital{
    var mayor:String = "Mayor Liu"
    var name:String="Beijing"
}

var xiaoli = Student()
xiaoli.country = Country()
if let country = xiaoli.country?.capital?.name {
    print("Xiaoli is from \(xiaoli.country?.capital?.name)")
} else {
    print("不知道哪來的>箍椤!耐齐!")
}

2.隱式解析可選

隱式解析可選和可選類型相似浪秘,都是由程序員對(duì)變量的初始化負(fù)責(zé)。隱式解析可選的含義是確定變量或者常量一定有值埠况。如下代碼耸携,使用!將變量variable聲明為隱式解析可選辕翰,就相當(dāng)于程序員在聲明的時(shí)候告訴編譯器违帆,確定該變量一定會(huì)有值,這樣就編譯器就不會(huì)拋出變量未初始化的錯(cuò)誤金蜀。雖然躲過了編譯器的檢查刷后,但是程序真正運(yùn)行時(shí),由于變量variable未初始化渊抄,值為nil尝胆,所以程序會(huì)crash。

var variable:Int!
print(variable)
//fatal error: unexpectedly found nil while unwrapping an Optional value

2.1隱式解析可選的其他使用
有時(shí)候在編碼的過程中由上下文的邏輯能清晰的確定變量有值护桦,這時(shí)就可以選擇使用隱式解析可選含衔,如下示例:

class Student {
    var country: Country?
}

class Country {
    var name:String="China"
}

var xiaoli = Student()
xiaoli.country = Country()
var name = xiaoli.country!.name;
print(name)

轉(zhuǎn)載:http://www.reibang.com/p/aec35fd36219

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市二庵,隨后出現(xiàn)的幾起案子贪染,更是在濱河造成了極大的恐慌,老刑警劉巖催享,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杭隙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡因妙,警方通過查閱死者的電腦和手機(jī)痰憎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攀涵,“玉大人铣耘,你說我怎么就攤上這事∫怨剩” “怎么了蜗细?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)怒详。 經(jīng)常有香客問我炉媒,道長(zhǎng)踪区,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任橱野,我火速辦了婚禮,結(jié)果婚禮上善玫,老公的妹妹穿的比我還像新娘水援。我一直安慰自己,他們只是感情好茅郎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布蜗元。 她就那樣靜靜地躺著,像睡著了一般系冗。 火紅的嫁衣襯著肌膚如雪奕扣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天掌敬,我揣著相機(jī)與錄音惯豆,去河邊找鬼。 笑死奔害,一個(gè)胖子當(dāng)著我的面吹牛楷兽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播华临,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芯杀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了雅潭?” 一聲冷哼從身側(cè)響起揭厚,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扶供,沒想到半個(gè)月后筛圆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椿浓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年顽染,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轰绵。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粉寞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出左腔,到底是詐尸還是另有隱情唧垦,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布液样,位于F島的核電站振亮,受9級(jí)特大地震影響巧还,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坊秸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一麸祷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧褒搔,春花似錦阶牍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至琳状,卻和暖如春磕瓷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背念逞。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工困食, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翎承。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓陷舅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親审洞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子莱睁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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