可選類型解包: if 和 guard

?一般來說,我們會優(yōu)先使用所謂的"early return"策略來避免if表達式中的多層嵌套的代碼。

在這種情況下使用guard語句能夠有效地提升代碼的可讀性。

//?PREFERRED

func?eatDoughnut(atIndex?index:?Int)?{

guard?index?>=?0?&&?index?<?doughnutselse{

//?return?early?because?the?index?is?out?of?bounds

return

}

let?doughnut?=?doughnuts[index]

eat(doughnut)

}

//?NOT?PREFERRED

func?eatDoughnuts(atIndex?index:?Int)?{

if ?index?>=?0?&&?index?<?donuts.count?{

let?doughnut?=?doughnuts[index]

eat(doughnut)

}

}

在對Optional類型進行解包的時候,優(yōu)先使用 guard 語句來避免if語句中較多的縮進议慰。

//?PREFERRED

guard?let?monkeyIsland?=?monkeyIsland ?else{

return

}

bookVacation(onIsland:?monkeyIsland)

bragAboutVacation(onIsland:?monkeyIsland)

//?NOT?PREFERRED

if let?monkeyIsland?=?monkeyIsland?{

bookVacation(onIsland:?monkeyIsland)

bragAboutVacation(onIsland:?monkeyIsland)

}

//?EVEN?LESS?PREFERRED

if monkeyIsland?==?nil?{

return

}

bookVacation(onIsland:?monkeyIsland!)

bragAboutVacation(onIsland:?monkeyIsland!)

在決定是要用if表達式還是guard表達式進行Optional類型解包的時候,最重要的點就是要保證代碼的可讀性奴曙。很多時候要注意因時而變别凹,因地制宜:

//?an?`if`?statement?is?readable?here

if ?operationFailed?{

return

}

//?a?`guard`?statement?is?readable?here

guard?isSuccessful ?else{

return

}

//?double?negative?logic?like?this?can?get?hard?to?read?-?i.e.?don't?do?this

guard ?!operationFailed else{

return

}


當(dāng)需要進行多可能性處理的時候,應(yīng)該優(yōu)先使用if表達式而不是guard表達式洽糟。

//?PREFERRED

if ?isFriendly?{

print("Hello,?nice?to?meet?you!")

}else{

print("You?have?the?manners?of?a?beggar.")

}

//?NOT?PREFERRED

guard?isFriendly ?else{

print("You?have?the?manners?of?a?beggar.")

return

}

print("Hello,?nice?to?meet?you!")


一般來說番川,guard應(yīng)該被用于需要直接退出當(dāng)前上下文的情形。而對于下面這種兩個條件互不干擾的情況脊框,應(yīng)該使用兩個if而不是兩個guard。

if ?let?monkeyIsland?=?monkeyIsland?{

bookVacation(onIsland:?monkeyIsland)

}

if ?let?woodchuck?=?woodchuck?where?canChuckWood(woodchuck)?{

woodchuck.chuckWood()

}


有時候我們會碰到要用guard語句進行多個optionals解包的情況践啄,一般而言浇雹,對于復(fù)雜的錯誤處理的Optional類型需要將其拆分到多個單個表達式中。

//?combined?because?we?just?return

guard?let?thingOne?=?thingOne,

let?thingTwo?=?thingTwo,

let?thingThree?=?thingThreeelse{

return

}

//?separate?statements?because?we?handle?a?specific?error?in?each?case

guard?let?thingOne?=?thingOneelse{

throwError(message:?"Unwrapping?thingOne?failed.")

}

guard?let?thingTwo?=?thingTwoelse{

throwError(message:?"Unwrapping?thingTwo?failed.")

}

guard?let?thingThree?=?thingThreeelse{

throwError(message:?"Unwrapping?thingThree?failed.")

}

不要將guard表達式強行縮寫到一行內(nèi)屿讽。

//?PREFERRED

guard?let?thingOne?=?thingOneelse{

return

}

//?NOT?PREFERRED

guard?let?thingOne?=?thingOneelse{return}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昭灵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子伐谈,更是在濱河造成了極大的恐慌烂完,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诵棵,死亡現(xiàn)場離奇詭異抠蚣,居然都是意外死亡,警方通過查閱死者的電腦和手機履澳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門嘶窄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怀跛,“玉大人,你說我怎么就攤上這事柄冲∥悄保” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵现横,是天一觀的道長漓拾。 經(jīng)常有香客問我,道長戒祠,這世上最難降的妖魔是什么骇两? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮得哆,結(jié)果婚禮上脯颜,老公的妹妹穿的比我還像新娘。我一直安慰自己贩据,他們只是感情好栋操,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饱亮,像睡著了一般矾芙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上近上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天剔宪,我揣著相機與錄音,去河邊找鬼壹无。 笑死葱绒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斗锭。 我是一名探鬼主播地淀,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼岖是!你這毒婦竟也來了帮毁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤豺撑,失蹤者是張志新(化名)和其女友劉穎烈疚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聪轿,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡爷肝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阶剑。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡跃巡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出牧愁,到底是詐尸還是另有隱情素邪,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布猪半,位于F島的核電站兔朦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏磨确。R本人自食惡果不足惜沽甥,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乏奥。 院中可真熱鬧摆舟,春花似錦、人聲如沸邓了。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骗炉。三九已至照宝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間句葵,已是汗流浹背厕鹃。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乍丈,地道東北人剂碴。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像轻专,于是被迫代替她去往敵國和親汗茄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

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