Я читал о Optionals в Swift и видел примеры, в которых if let
он используется, чтобы проверить, содержит ли Optional значение, и, если это так, сделайте что-нибудь с развернутым значением.
Однако я видел, что в Swift 2.0 в guard let
основном используется ключевое слово . Интересно, было ли if let
удалено из Swift 2.0 или его все еще можно использовать.
Следует ли мне изменить свои программы, содержащие if let
в guard let
?
источник
if let
когдаnon-nil
случай действителен. Используйте,guard
когдаnil
регистр представляет собой какую-то ошибку.guard
это уместно, даже если ошибки нет. Иногда это просто означает, что делать нечего. Например,positionTitle
метод можетguard if let title = title else {return}
. Заголовок может быть необязательным, и в этом случае это не ошибка. Ноguard let
все равно уместно.if let
видна только внутриif let
области видимости. После этогоguard let
будет видна переменная, связанная с . Поэтому имеет смысл использовать guard для привязки необязательных значений.Охрана может улучшить четкость
Когда вы используете охранник, у вас гораздо больше ожиданий, что охранник добьется успеха, и несколько важно, что если он не удастся, вы просто захотите выйти из области видимости раньше . Как вы охраняете, существует ли файл / изображение, является ли массив пустым или нет.
Если вы напишете приведенный выше код с помощью if-let, он покажет читающему разработчику, что это больше 50-50. Но если вы используете guard, вы добавляете ясности в свой код, и это означает, что я ожидаю, что это сработает в 95% случаев ... если это когда-нибудь не удастся, я не знаю, почему это произойдет; это очень маловероятно ... но тогда просто используйте это изображение по умолчанию или, возможно, просто подтвердите с осмысленным сообщением, описывающим, что пошло не так!
Кроме того, в результате приведенных выше предложений и чистого кода более вероятно, что вы захотите / должны будете добавлять утверждения в неудавшиеся операторы защиты, это просто улучшает читаемость и дает другим разработчикам понять, чего вы ожидали.
(вы не будете использовать утверждения / предварительные условия для
if-let
s. Это просто не кажется правильным)Использование охранников также поможет вам улучшить ясность, избегая пирамиды гибели. См . Ответ Нитина .
Guard создает новую переменную
Есть одно важное различие, которое, как мне кажется, никто не объяснил.
Оба
guard let
иif let
развернуть переменную, однакоС помощью
guard let
вы создаете новую переменную, которая будет существовать внеelse
оператора.При этом
if let
вы не создаете никакой новой переменной - после оператора else вы вводите блок кода, только если необязательный параметр не равен нулю. Вновь созданная переменная существует только внутри блока кода, а не после!guard let:
if-let:
Для получения дополнительной информации
if let
см .: Почему повторное объявление необязательной привязки не приводит к ошибкеОхранник требует выхода из прицела
(Также упоминается в ответе Роба Напьера):
Вы ДОЛЖНЫ
guard
определить внутри func. Его основная цель - прервать / вернуть / выйти из области действия, если условие не выполняется:Поскольку
if let
вам не нужно иметь его внутри какой-либо функции:guard
противif
Стоит отметить , что это более уместно , чтобы увидеть этот вопрос , как
guard let
противif let
иguard
противif
.Автономная версия
if
не выполняет разворачивания, как и автономная версияguard
. См. Пример ниже. Если есть значение, он не выходит раньше срокаnil
. Нет дополнительных значений. Он просто выходит рано, если условие не выполняется.источник
Когда
if-let
и когда использоватьguard
- это часто вопрос стиля.Скажем, у вас есть
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
и необязательный массив items (var optionalArray: [SomeType]?
), и вам нужно вернуть либо,0
если массивnil
(не установлен), либоcount
если массив имеет значение (установлено).Вы можете реализовать это так, используя
if-let
:или вот так, используя
guard
:Примеры функционально идентичны.
Что
guard
действительно хорошо, так это когда у вас есть такая задача, как проверка данных, и вы хотите, чтобы функция вылетала раньше, если что-то пойдет не так.Вместо того, чтобы вкладывать кучу
if-let
s по мере приближения к завершению проверки, «путь успеха» и теперь успешно связанные опции находятся в основной области действия метода, потому что все пути отказа уже вернулись.источник
Я попытаюсь объяснить полезность операторов защиты с помощью некоторого (неоптимизированного) кода.
У вас есть пользовательский интерфейс, в котором вы проверяете текстовые поля для регистрации пользователя с именем, фамилией, адресом электронной почты, телефоном и паролем.
Если какое-либо поле textField не содержит допустимого текста, оно должно сделать это поле firstResponder.
вот неоптимизированный код:
Вы можете видеть выше, что все строки (firstNameString, lastNameString и т. Д.) Доступны только в рамках оператора if. поэтому он создает эту «пирамиду гибели» и имеет много проблем с ней, включая удобочитаемость и простоту перемещения (если порядок полей изменяется, вам придется переписать большую часть этого кода)
С помощью оператора guard (в приведенном ниже коде) вы можете видеть, что эти строки доступны за пределами
{}
и используются, если все поля действительны.Если порядок полей изменится, просто переместите соответствующие строки кода вверх или вниз, и все готово.
Это очень простое объяснение и вариант использования. Надеюсь это поможет!
источник
Основная разница
Охрана пусть
если позволите
ПРИМЕЧАНИЕ. Оба используются для развертывания необязательной переменной.
источник
Самое ясное объяснение, которое я видел, было в Руководстве по стилю Github Swift :
if
добавляет уровень глубины:guard
нет:источник
охрана
Заявление охранника имеет следующую форму:
если позволите
источник
Я научился этому у Свифта с Бобом ..
Типичное «Иначе если»
Проблемы с Else-If
Заявление защиты Блок защиты выполняется только в том случае, если условие ложно, и он выйдет из функции через return. Если условие истинно, Swift игнорирует блокировку защиты. Обеспечивает ранний выход и меньшее количество скобок.
Разверните опции с помощью Else-If
Оператор защиты не только полезен для замены типичного условного блока оператором else-if, но также отлично подходит для разворачивания опций за счет минимизации количества скобок. Для сравнения давайте сначала начнем с того, как развернуть несколько опций с помощью else-if. Во-первых, давайте создадим три варианта, которые будут развернуты.
Худший кошмар
Приведенный выше код определенно работает, но нарушает принцип DRY. Это ужасно. Разобьем это +.
Немного лучше Код ниже более читабелен, чем приведенный выше.
Распаковать с помощью Guard Операторы else-if можно заменить на guard.
Развертывание нескольких опций с помощью Else-If До сих пор вы разворачивали опционы один за другим. Swift позволяет нам развернуть сразу несколько опций. Если один из них содержит nil, он выполнит блок else.
Разверните несколько опций с помощью Guard. Конечно, мы должны использовать защиту от else-if. +
источник