Swift 2 3 這些情況下guard要慎用

2021-07-09 11:49:33 字數 1928 閱讀 5884

在 swift 2.0 中,帶來了令人激動的的 guard 語句。但是還是有人不太理解 guard 的意義,特別是同 swift 2.0 之前簡單的 if 語句相比較來看。

我們知道,所有的 guard 使用場景都可以用 if 來替代,那麼為什麼還要增加 guard 特性呢?

其最最主要的原因還是guard 語法的可讀性更強。

它可以讓我們的方法表意更加明確,更易於閱讀,它能夠表達「提前退出」的意圖,提高了程式的健壯性。

換句話來理解這是 swift 的設計者在暗示程式設計師在編寫**時時提早 return 的重要性。

但是,並不意味著要將所有的 if ... else ... 和 if let ... 都替換成 guard 語法。

guard 語法很容易被濫用和誤用,並不是所有的**層次結構中都適合 guard 的使用。

作為 if 的相反情況

可以理解為作用域內的**只有在傳遞進來的條件被判斷為 false 的時候才執行

如當我們需要判斷乙個閉包參數列列中的 error 引數是否有返回值的時候,當 error 為 nil 時我們才有必要執行作用域內的**,反之 return。

這種情況下用 if 去實現就十分的清晰,可讀性更高:

geocoder.geocodeaddressstring(textstr) 

// 如果有結果,那麼看一下結果是否為空,為空退出

guard let placemarks = placemarks else

// 遍歷所有的座標(經緯度)

for place in placemarks

}

如果用 guard 去處理上面的 error,那麼**就變成了這樣:

geocoder.geocodeaddressstring(textstr) 

// 遍歷所有的座標(經緯度)

for place in placemarks

}// 作用域**(存在 error,程式結束)

print("error --- \(error)")

return

}

顯然,用 guard 去處理上述情況就非常的不妥,造成了 guard 的大括號內還巢狀了乙個 for 迴圈,可讀性大大降低。

換句話說,如果你想讓這個引數有值並使用它,那麼就用 guard,如果你不想讓這個引數有值那麼就用 if 去判斷。這樣就可以將錯誤以及之後的 return 集中在乙個大括號內,而順利執行的作用域**就在大括號外了。增強了**的可讀性。

guard 的 else 語句中,不應該放大量的**,除了簡單的提前退出的語句外。如果你在 guard 的 else **塊中用了其他的**邏輯或是實現了任何實際功能,那麼你就誤用了 guard 了。

總之,除一些簡單提前退出的語句和一些離開了當前函式的必要操作外,不應該有其他的**。

最好在 guard 的 else 語句塊內不要多過 2 ~ 3 行**。

如下面一段**採用 if else 去實現:

var str : string? = "hello"

if let hellostr = str where str!.hasprefix("h") else

若採用 guard 去實現:

var str : string? = "hello"

guard let hellostr2 = str where str!.hasprefix("h") else

print(hellostr2)

對於這種簡單的情況而言,使用 if else 語句比起沒有分支的 guard 語法更加容易理解。

最後提醒一點:在使用 guard 的時候,請確保自己已經對可選鏈有乙個正確的了解,guard 可以幫助我們避免使用顯示的 if let 進行解包。

Swift學習筆記系列 (23)泛型

tags swift 學習筆記 感慨一下 泛型這一章很亂,很零碎,很難總結。避免重複 增加靈活性 所有型別 泛型是另外一種引數,引數表示的是型別,泛型小可以用在函式上,大可用在型別定義上。這裡 型別 不包括協議,協議定義不能直接採用泛型,可以採用關聯型別。函式引數的型別也是引數的函式叫做泛型函式。這...

2 3 Swift字串比較

swift 字串比較 都可以啊 letstr hello 判斷兩個字串是否相同,在 objective c 中是isequaltostring if str hello ifstr heoo ifstr heoo letstr1 判斷是否含有字首 if str1.hasprefix ap 判斷是否含...

swift 學習筆記 23 屬性 屬性觀察器

這裡定義乙個類,number,乙個屬性為 max,代表最大值,先不看後面 willset 等的內容,如果只是乙個普通的屬性,當改變這個屬性值的時候很好改變,隨便賦值,不管後來的值是否比原來的值大還是小 當有需求為,後面賦值比原來值大時,賦值成功,小於原來值的時候,保持原值,就需要 判斷了,就需要屬性...