通俗講guard和if-else、switch同屬於控制流範疇語句,if-esle和switch都屬於上古語句歷史悠久,guard確定是後來者。swift
後來者的出現確定是要解決一些前人沒法解決的問題。記得有位大神說過「當你開始寫switch時,你代碼就開始墮落了」,可見switch語句時多麼不受高手們的喜好。
guard是swift 2.0引入的,他有兩個強大的理念optional unwrapping 和 where clauses 。optional unwrapping 讓咱們避免金字塔式冗長的if語句。where clauses 附加了簡單而強大的where表達式,讓咱們能夠很是方便審視正在驗證的結果。app
例如,咱們有多個文本庫用於收集用戶的基本信息。爲了保證輸入不爲空,咱們須要逐個對文本框進行開包檢查。
傳統if-else方式,很容易形成金字塔的代碼臃腫,相比你們平時沒少寫這類代碼。具體代碼以下:函數
func nonguardSubmit() { if let name = nameField.text { if let address = addressField.text { if let phone = phoneField.text { sendToServer(name, address: address, phone: phone) } else { show("no phone to submit") } } else { show("no address to submit") } } else { show("no name to submit") } }
爲了解決這個問題,咱們可使用guard語句spa
func submit() { guard let name = nameField.text else { show("No name to submit") return } guard let address = addressField.text else { show("No address to submit") return } guard let phone = phoneField.text else { show("No phone to submit") return } sendToServer(name, address: address, phone: phone) }
guard true else { print("Condition not met") } print("Condition met")
func someFunction() { guard false else { print("Condition not met") return } print("Condition met") } someFunction() print("Hello after function call")
輸出結果code
Condition not met Hello after function call
guard whith optionalblog
func changeOptionalStringToUpperCase() { var name:String? guard let temp = name else { print("Name is nil. Cannot process") return } print("Uppercased:\(temp.uppercased())") } changeOptionalStringToUpperCase()
輸出結果教程
Name is nil. Cannot process
Guard with multiple conditionsip
func changeOptionalStringToUpperCase() { var name:String? = "" guard let temp = name , temp.count > 0 else { print("Name is nil or an empty string. Cannot process") return } print("Uppercased:\(temp.uppercased())") } changeOptionalStringToUpperCase()
在 Swift 中,有三種類型的語句:簡單語句、編譯器控制語句和控制流語句。簡單語句是最多見的語句,由表達式或聲明組成。編譯器控件語句容許程序更改編譯器行爲的各個方面,幷包括條件編譯塊和行控制語句。作用域
控制流語句用於控制程序中的執行流。Swift 中有幾種類型的控制流語句,包括循環語句、分支語句和控制傳輸語句。循環語句容許重複執行代碼塊,分支語句容許僅在知足某些條件時執行特定代碼塊,而且控制傳輸語句提供了一種更改代碼執行順序的方法。此外,Swift 還提供了一個 do 語句來引入做用域,並捕獲和處理錯誤,並提供一個延遲語句,用於在當前做用域退出以前運行清理操做。rem
分支語句
分支語句容許程序根據一個或多個條件的值執行代碼的某些部分。分支語句中指定的條件的值控制程序如何分支,所以,執行什麼代碼塊。Swift 有三個分支語句:if 語句、guard語句和switch語句。
若是未知足一個或多個條件,則使用保護語句將程序控制轉移到做用域外。
guard condition else { statements }
guard 語句的else是必需的,而且必須使用如下語句之一調用"Nerver"類型的函數或將程序控制權轉移到保護語句的封閉範圍以外: