?一般來說,我們會優(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}