Swift 2 ввел guard
ключевое слово, которое можно использовать для обеспечения готовности различных данных к работе. Пример, который я видел на этом сайте, демонстрирует функцию submitTapped:
func submitTapped() {
guard username.text.characters.count > 0 else {
return
}
print("All good")
}
Мне интересно, если использование guard
отличается от того, как делать это по старинке, используя if
условие. Это дает преимущества, которые вы не могли получить, используя простую проверку?
swift2
guard-statement
Дэвид Снабель
источник
источник
Ответы:
Читая эту статью, я заметил большие преимущества использования Guard
Здесь вы можете сравнить использование охранника с примером:
Это часть без охраны:
Здесь вы помещаете желаемый код в любых условиях
Вы можете не сразу увидеть проблему с этим, но вы можете себе представить, насколько запутанной она может стать, если она содержит множество условий, которые должны быть выполнены перед выполнением ваших утверждений.
Способ убрать это - сначала выполнить каждую из ваших проверок и выйти, если таковые не были выполнены. Это позволяет легко понять, из каких условий выйдет эта функция.
Но теперь мы можем использовать охрану, и мы видим, что возможно решить некоторые проблемы:
Этот же шаблон действует и для не необязательных значений:
Если у вас остались какие-либо вопросы, вы можете прочитать всю статью: Swift guard.
Завершение
И, наконец, читая и тестируя, я обнаружил, что если вы используете охрану, чтобы развернуть какие-либо дополнительные функции,
,
Здесь развернутое значение будет доступно только внутри блока if
источник
let x = x where x > 0
означает ли это, что вы включили другое условие в необязательную привязку? Я имею в виду, что это немного отличается отif let constantName = someOptional { statements }
В отличие от
if
,guard
создает переменную, к которой можно получить доступ за пределами ее блока. Это полезно, чтобы развернуть многоOptional
с.источник
Есть действительно два больших преимущества
guard
. Один из них избегает пирамиды гибели, как уже упоминали другие, - множество раздражающихif let
утверждений, вложенных друг в друга, движутся все дальше и дальше вправо.Другим преимуществом часто является логика, которую вы хотите реализовать, это больше "
if not let
" чем "if let { } else
».Вот пример: предположим , что вы хотите реализовать
accumulate
- помесьmap
иreduce
где он дает вам обратно массив работы снижается. Вот оно сguard
:Как бы вы написали это без охраны, но все еще используя
first
это возвращает необязательный? Что-то вроде этого:Дополнительный раскрой раздражает, но и это не так логично иметь
if
иelse
так далеко друг от друга. Намного удобнее иметь ранний выход для пустого регистра, а затем продолжить с остальной частью функции, как если бы это было невозможно.источник
Когда условие выполняется, используя
guard
его, он выставляет переменные, объявленные вguard
блоке, остальной части кодового блока, перенося их в свою область видимости. Что, как уже говорилось, наверняка пригодится с вложеннымиif let
утверждениями.Обратите внимание, что охранник требует возврата или броска в своем операторе else.
Разбор JSON с гвардией
Ниже приведен пример того, как можно проанализировать объект JSON, используя guard, а не if-let. Это отрывок из записи блога, которая включает в себя файл игровой площадки, который вы можете найти здесь:
Как использовать Guard в Swift 2 для разбора JSON
скачать игровую площадку
Больше информации:
Вот выдержка из руководства по языку программирования Swift:
источник
Одним из преимуществ является устранение множества вложенных
if let
утверждений. Посмотрите видео WWDC "Что нового в Swift" около 15:30, раздел под названием "Пирамида Судьбы".источник
Когда использовать охрану
Если у вас есть контроллер представления с несколькими элементами UITextField или каким-либо другим типом пользовательского ввода, вы сразу заметите, что вы должны развернуть необязательный textField.text, чтобы получить доступ к тексту внутри (если есть!). isEmpty здесь не поможет, без ввода текстовое поле просто вернет nil.
Таким образом, у вас есть несколько из них, которые вы разворачиваете и в конечном итоге передаете функции, которая отправляет их на конечную точку сервера. Мы не хотим, чтобы код сервера имел дело с нулевыми значениями или по ошибке отправлял недопустимые значения на сервер, поэтому сначала мы развернем эти входные значения с защитой.
Вы заметите, что наша коммуникационная функция сервера принимает в качестве параметров необязательные значения String, следовательно, защитное развертывание заранее. Развертывание немного неинтуитивно, потому что мы привыкли разворачивать с помощью if let, который разворачивает значения для использования внутри блока. Здесь у оператора guard есть связанный блок, но на самом деле это блок else - то есть то, что вы делаете в случае неудачного развертывания - значения развертываются прямо в тот же контекст, что и сам оператор.
// разделение интересов
Без охраны
Без использования охраны мы получили бы большую кучу кода, напоминающего пирамиду гибели . Это плохо масштабируется для добавления новых полей в нашу форму или для очень удобочитаемого кода. За отступами может быть трудно следить, особенно с таким количеством других операторов на каждой ветке.
Да, мы могли бы даже объединить все эти операторы let в один оператор, разделенный запятыми, но мы потеряли бы возможность выяснить, какой оператор потерпел неудачу, и представить сообщение пользователю.
https://thatthinginswift.com/guard-statement-swift/
источник
С помощью охраны наше намерение ясно. мы не хотим выполнять остальную часть кода, если это конкретное условие не выполняется. здесь мы можем расширить цепочку, пожалуйста, посмотрите на код ниже:
источник
Охранное заявление собираюсь сделать. это пара разных
1) это позволяет мне уменьшить вложенный if оператор
2) это увеличить мою область видимости, которую моя переменная доступна
если заявление
Охранное заявление
источник
Охранное заявление
Защитный оператор используется для передачи управления программой из области действия, если не выполнено одно или несколько условий.
Synatx:
Преимущество:
1. Используя
guard
оператор, мы можем избавиться от глубоко вложенных условных выражений, единственной целью которых является проверка набора требований.2. Он был разработан специально для раннего выхода из метода или функции.
если вы используете, если ниже приведен код, как это выглядит.
Используя охрану, вы можете вывести управление из области видимости, если не выполнено одно или несколько условий.
Ссылка:
1. Swift 2: выход рано с охраной 2. Udacity 3. Заявление охранника
источник
if condition { return }
угрюмый?Как и оператор if, guard выполняет операторы на основе логического значения выражения. В отличие от оператора if, защитные операторы выполняются только в том случае, если условия не выполняются. Вы можете думать об охране больше как о Assert, но вместо того, чтобы разбиться, вы можете грациозно выйти.
обратитесь к: http://ericcerney.com/swift-guard-statement/
источник
Это действительно делает поток последовательности с несколькими поисками и опциями намного более кратким и понятным и уменьшает количество вложений. Смотрите сообщение Эрики Садун о замене Ifs . .... Может увлечься, пример ниже:
Посмотрите, если это придерживается.
источник
Проще говоря, он предоставляет способ проверки полей перед выполнением. Это хороший стиль программирования, поскольку он улучшает читабельность. На других языках это может выглядеть так:
Но поскольку Swift предоставляет вам дополнительные функции, мы не можем проверить, равен ли он нулю, и присвоить его значение переменной. Напротив,
if let
проверяет, что это не ноль и назначает переменную для хранения фактического значения. Это гдеguard
вступает в игру. Это дает вам более краткий способ выхода из раннего использования опций.источник
Источник: Страж в Свифте
Давайте посмотрим на пример, чтобы понять это ясно
Пример 1:
В приведенном выше примере мы видим, что 3 больше 2, и оператор внутри предложения guard else пропускается, и выводится True.
Пример 2:
В приведенном выше примере мы видим, что 1 меньше 2, и оператор внутри предложения guard else выполняется, и выводится False с последующим возвратом.
В приведенном выше примере мы используем guard let, чтобы развернуть опции. В функции getName мы определили переменную типа string myName, которая является необязательной. Затем мы используем guard let, чтобы проверить, равна ли переменная myName нулю или нет, если не присвоено имя и еще раз проверить, имя не пусто. Если оба условия удовлетворены, т.е. истинно, блок else будет пропущен и выведите «Условия выполнены с именем».
По сути, мы здесь проверяем две вещи, разделенные запятой, сначала разворачиваем и необязательно, и проверяем, удовлетворяет ли это условию или нет.
Здесь мы ничего не передаем функции, т. Е. Пустой строке, и, следовательно, условие false - это print.
Здесь мы передаем «Hello» в функцию, и вы можете видеть, что вывод печатается «Условие выполнено Hello».
источник