• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • SwiftUI guard 是什么如何用(2020教程)

    guard 是一種控制流語句

    通俗講guard和if-else、switch同屬于控制流范疇語句,if-esle和switch都屬于上古語句歷史悠久,guard肯定是后來者。

    后來者的出現肯定是要解決一些前人無法解決的問題。記得有位大神說過“當你開始寫switch時,你代碼就開始墮落了”,可見switch語句時多么不受高手們的喜愛。
    guard是swift 2.0引入的,他有兩個強大的理念optional unwrapping 和 where clauses 。optional unwrapping 讓我們避免金字塔式冗長的if語句。where clauses 附加了簡單而強大的where表達式,讓我們可以非常方便審視正在驗證的結果。

    什么時候使用guard

    例如,我們有多個文本庫用于收集用戶的基本信息。為了保證輸入不為空,我們需要逐個對文本框進行開包檢查。
    傳統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語句

    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)
    }
    

    執行順序

    41085-457cc804a7e3d1c8.jpg
    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")
    

    輸出結果

    Condition not met
    Hello after function call
    

    guard whith optional

    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 conditions

    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
    版權聲明:本文為iCloudEnd原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/iCloudEnd/article/details/104086255

    智能推薦

    SwiftUI List 如何顯示dictionary

    本文價值與收獲 看完本文后,您將能夠作出下面的界面 看完本文您將掌握的技能 list基礎使用 顯示dictionary 代碼 技術交流 QQ:3365059189 SwiftUI技術交流QQ群:518696470...

    SwiftUI之Codable是什么(含解析JSON源碼)

    什么Codable Codable是一種將JSON數據(或字典)綁定到Swift中的模型/類/對象的方法。 Codable首先在Swift 4中可用,它省去了手動綁定和保護JSON響應的工作。 實戰代碼 [email protected] Codable協議使解碼平面數據變得很簡單:如果您解碼的是一個類型的單個實例,或者這些實例的數組或字典,那么一切就正常了。下面我們將解碼稍微...

    SwiftUI之List 和form(2020版)

    SwiftUI之List 和form(2020版) VStack 效果 image.png List 效果 image.png List with header & footer 效果 image.png List & navigation Treat.swift 效果 image.png 完成代碼 效果 image.png...

    SwiftUI-WWDC2020-實例展示

    整體效果 總體效果 代碼實現 目錄結構 sandwichApp.swift 程序入口文件,store作為全局變量聲明在此文件,并作為參數傳入ContentView ContentView.swift 主頁面,所有功能和業務邏輯都在此頁面,是一個App的列表頁面,可以新增,移動,刪除,編輯,點擊單元格可進入詳情頁面。單元格抽象為SandwichCell。 SandwichDetail.swift 詳...

    SwiftUI ListItemTint 基礎教程(含源碼)

    ListItemTint 應用于列表中內容的色調效果的配置。 實戰代碼 技術交流 QQ:3365059189 SwiftUI技術交流QQ群:518696470...

    猜你喜歡

    SwiftUI UITabBarController 基礎教程含代碼

    UITabBarController 一個容器視圖控制器,管理radio-style的選擇界面,其中的選擇確定要顯示的子視圖控制器。 使用教程 標簽欄界面在窗口底部顯示標簽,用于在不同模式之間進行選擇并顯示該模式的視圖。此類通常按原樣使用,但也可以子類化。 標簽欄控制器界面的每個標簽都與一個自定義視圖控制器關聯。當用戶選擇特定的選項卡時,選項卡欄控制器將顯示相應視圖控制器的根視圖,以替換任何先前的...

    SwiftUI 封裝UITabBarController 教程含源碼

    本文價值與收獲 看完本文后,您將能夠作出下面的界面 基礎知識 UITabBarController是什么 一個容器視圖控制器,管理radio-style的選擇界面,其中的選擇確定要顯示的子視圖控制器。 使用教程 標簽欄界面在窗口底部顯示標簽,用于在不同模式之間進行選擇并顯示該模式的視圖。此類通常按原樣使用,但也可以子類化。 代碼 1、封裝方案一 代碼截圖...

    Lottie動畫+SwiftUI教程(CocoaPods & SPM)

    目錄 前言 0 準備工作 1 Xcode新建SwiftUI項目 2 通過CocoaPods安裝Lottie(二選一) 2 通過SPM安裝Lottie(二選一) 第一步:File→Swift Packages→Add 第二步:添加第三方庫的鏈接 第三步:設置項目的Dead Code Stripping 3 添加一個JSON格式的Lottie動畫 4 添加文件LottieView....

    SwiftUI 新屬性MenuPickerStyle 教程含源碼

    實戰需求 SwiftUI 新屬性MenuPickerStyle,允許Picker在菜單中顯示其選項。這種風格將在主頁面進行遮蓋處理。本文將演示一下MenuPickerStyle的基礎使用 本文價值與收獲 看完本文后,您將能夠作出下面的界面 看完本文您將掌握的技能 掌握Picker基礎使用 掌握MenuPickerStyle基礎使用 實現菜單彈出效果 基礎知識 MenuPickerStyle 一種選...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    精品国产乱码久久久久久蜜桃不卡