在 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 等的內容,如果只是乙個普通的屬性,當改變這個屬性值的時候很好改變,隨便賦值,不管後來的值是否比原來的值大還是小 當有需求為,後面賦值比原來值大時,賦值成功,小於原來值的時候,保持原值,就需要 判斷了,就需要屬性...