if let 和 guard let 有什麼不一樣的地方

法蘭克的 iOS 世界
2 min readOct 12, 2020

--

既然有了 if let,為什麼還要生出一個 guard let 呢?在釐清這個問題時,應站在 guard let 其實是 if let 的進階版來思考這件事。 guard let 不僅在 邏輯思維上與 if let 大不相同外,其 scope、可讀性也大不相同,以下就針對這三點來說明之。

邏輯思維

guard 顧名思義有防守、防衛的意思。因此,它的邏輯思維和 if let 是相反的。

if let 會執行 block 內的邏輯;而 guard let 則會執行 block 外的邏輯

當 name 不為空的時侯,if let 會執行 block 內的邏輯;而 guard let 則會執行 block 外的邏輯

Scope

if let optional binding 的常數在只能在 block 內被讀取;而 guard let 則 只能在block 外可被讀取

在 block 外試著讀取 if let 的 optional binding 常數和在 block 內試著讀取 guard let 的 optional binding 的常數,編譯器皆會產生錯誤。

可讀性

舉一開發上常用的情境來說明此議題,假設有一個 func 要驗證姓名和生日,如果使用者輸入錯誤的姓名,要提示"請輸入正確的姓名",輸入錯誤的生日,要提示"請輸入正確的生日"。試著使用 if let 和 guard let 來處理這段邏輯,即可看出很明顯的差異。

if let

if let control flow

guard let

guard let control flow

由上述可明顯看出 if let 在處理這段邏輯時,必須使用巢狀的 block,這使得在閱讀上相對於 guard let 要花比較多的精力在上面。反觀 guard let 不僅不需要巢狀的 block,並且能夠一眼就能夠讓其它人看出程式的邏輯。

如果您喜歡我的文章,請多按幾下「拍手」給我鼓勵,或是按「follow」讓我持續提供好文章給您。

--

--

No responses yet