Заявление Swift Guard (с примерами)

В этой статье вы научитесь использовать оператор guard для управления потоком выполнения вашей программы.

Оператор Swift If описывает, как вы можете выполнять действия в зависимости от определенного условия (логического значения). В этой статье мы рассмотрим преимущества оператора guard по сравнению с оператором if для управления потоком программы и написания более простого и чистого кода.

Заявление Swift Guard

Основное использование оператора guard - передача управления программой за пределы области действия при определенных условиях. Эти операторы похожи на операторы if, которые выполняют операторы на основе определенного условия (логическое значение), но в отличие от if операторы защиты выполняются только тогда, когда определенные условия не выполняются.

Более того, заявления внутри охранника должны выходить из области видимости. Поэтому мы должны управляющие операторы программы пользователя return, break, continueили throwв конце защитного заявления.

Синтаксис заявления защиты

 защитное выражение else (// операторы // должны содержать оператор управления: return, break, continue или throw.) 
  • Здесь выражение - это логическое выражение (возвращает либо trueили false).
  • Если выражение оценивается false, guardвыполняются операторы внутри блока кода .
  • Если выражение оценивается true, инструкции внутри блока кода guardпропускаются из выполнения.

Как работает охранник?

Примечание: Конец защитного заявления должен содержать контрольное заявление return, break, continueили throw.

Пример 1: Как работает инструкция защиты?

Ниже приведен простой действительный защитный оператор:

 guard true else ( print("Condition not met") ) print("Condition met") 

Когда вы запустите программу, вывод будет:

 Условие выполнено

В приведенной выше программе guard содержит логическое значение true (условие выполнено). Поскольку операторы защиты запускаются только тогда, когда условие не выполняется, оператор внутри защиты не выполняется. Поэтому print("Condition met")выполняется и выводится на экран Условие выполнено .

Теперь давайте изменим условие на false как:

Пример 2: оператор guard должен выйти из области видимости

 guard false else ( print("Condition not met") ) print("Condition met") 

В приведенной выше программе условие защиты оценивается как false. Итак, оператор print("Condition not met")внутри else должен выполняться. Но вы получите сообщение об ошибке, в котором говорится , что тело "стража" не может провалиться, рассмотрите возможность использования "возврата" или "выброса" для выхода из области видимости.

Сообщение об ошибке в простых средств слов, вам нужно передать управление программой из защитного заявления с использованием return, break, continueили throwзаявления. А пока воспользуемся return. А поскольку returnоператор может использоваться только внутри функции, мы собираемся обернуть приведенный выше код в функции Swift.

Пример 3: инструкция защиты внутри функции

Мы можем использовать оператор guard внутри функции в Swift как:

 func someFunction() ( guard false else ( print("Condition not met") return ) print("Condition met") ) someFunction() print("Hello after function call") 

Когда вы запустите вышеуказанную программу, результат будет:

 Условие не выполнено Привет после вызова функции 

В приведенной выше программе оценивается условие защиты false, поэтому инструкции внутри защиты выполняются. Первый оператор print("Condition not met")выводит в консоли « Условие не выполнено» .

И оператор returnзавершает выполнение функции, а оператор print("Hello, after function call")после вызова функции, который выводит Hello после вызова функции в консоли.

Пример 4: Защита с опциями

Мы видели в Swift Optionals использование if-letдля разворачивания необязательного. Однако мы также можем использовать оператор guard вместо if-letразвертывания необязательного элемента с одним преимуществом. Основное преимущество развертывания необязательной if-letпеременной с помощью guard вместо того, чтобы мы могли увеличить объем развернутой переменной.

Давайте посмотрим на это на примере ниже:

 func changeOptionalStringToUpperCase() ( var name:String? guard let temp = name else ( print("Name is nil. Cannot process") return ) print("Uppercased:(temp.uppercased())") ) changeOptionalStringToUpperCase() 

Когда вы запустите вышеуказанную программу, результат будет:

Имя равно нулю. Невозможно обработать

В приведенной выше программе вы можете видеть, что развернутое значение temp используется за пределами области, определенной оператором guard. Поскольку name определяется как необязательный и содержит значение nil, оператор защиты не может развернуть значение.

Итак, инструкции внутри guard выполняет else, которые выводят Name is nil. Невозможно обработать вывод и завершить функцию с помощью returnоператора. Эквивалентный код приведенного выше оператора защиты if-else:

 func changeOptionalStringToUpperCase() ( var name:String? if let temp = name ( print("Uppercased:(temp.uppercased())") ) else ( print("Name is nil. Cannot process") return ) //how to access temp here?? Solution:Use Guard ) changeOptionalStringToUpperCase() 

Обратите внимание, что два приведенных выше утверждения действительны и выполняют одну и ту же работу. Но используя оператор if-let, вы не можете использовать развернутое значение вне оператора if-let. Но с оператором guard вы можете использовать развернутое значение в функции.

Пример 5: охрана с несколькими условиями

Операторы защиты также могут объединять несколько условий, разделенных запятыми (,), как:

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

Когда вы запустите вышеуказанную программу, результат будет:

Имя - ноль или пустая строка. Невозможно обработать

В приведенной выше программе оператор защиты содержит два условия, разделенные запятой.

Первое условие let temp = nameразворачивает необязательный параметр, который возвращается trueв нашем случае, а второе условие temp.count> 0проверяет, содержит ли развернутая строка более 0 символов, что соответствует falseв нашем примере.

Следовательно, оператор внутри оператора защиты выполняет оператор, print("Name is nil or an empty string. Cannot process")который выводит Name равным нулю или пустой строкой. Не удается выполнить обработку в консоли и завершает функцию с помощью returnоператора.

Интересные статьи...