SwiftUI guard 是什麼如何用(2020教程)

guard 是一種控制流語句

通俗講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表達式,讓咱們能夠很是方便審視正在驗證的結果。bash

何時使用guard

例如,咱們有多個文本庫用於收集用戶的基本信息。爲了保證輸入不爲空,咱們須要逐個對文本框進行開包檢查。 傳統if-else方式,很容易形成金字塔的代碼臃腫,相比你們平時沒少寫這類代碼。具體代碼以下:app

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語句函數

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 執行順序

簡單demo

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")
複製代碼

輸出結果ui

Condition not met
Hello after function call
複製代碼

guard whith optionalspa

func changeOptionalStringToUpperCase() {
	var name:String?
	guard let temp = name else {
		print("Name is nil. Cannot process")
		return
	}
	print("Uppercased:\(temp.uppercased())")
}
changeOptionalStringToUpperCase()
複製代碼

輸出結果code

Name is nil. Cannot process
複製代碼

Guard with multiple conditionscdn

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 中有幾種類型的控制流語句,包括循環語句、分支語句和控制傳輸語句。循環語句容許重複執行代碼塊,分支語句容許僅在知足某些條件時執行特定代碼塊,而且控制傳輸語句提供了一種更改代碼執行順序的方法。此外,Swift 還提供了一個 do 語句來引入做用域,並捕獲和處理錯誤,並提供一個延遲語句,用於在當前做用域退出以前運行清理操做。

分支語句 分支語句容許程序根據一個或多個條件的值執行代碼的某些部分。分支語句中指定的條件的值控制程序如何分支,所以,執行什麼代碼塊。Swift 有三個分支語句:if 語句、guard語句和switch語句。

guard 語句

若是未知足一個或多個條件,則使用保護語句將程序控制轉移到做用域外。

guard condition else {
    statements
}
複製代碼
  • 在guard語句中任何條件的值必須是 Bool 類型或橋接到 Bool 的類型。該條件也能夠是optional binding declaration.
  • 從 guard 語句條件中的可選綁定聲明分配值的任何常量或變量均可用於 guard 語句的封閉做用域的其他部分。
  • guard 語句的else是必需的,而且必須使用如下語句之一調用"Nerver"類型的函數或將程序控制權轉移到保護語句的封閉範圍以外:
    • return
    • break
    • continue
    • throw

更多SwiftUI教程和代碼關注專欄

相關文章
相關標籤/搜索