Как элегантно сочетать охранное выражение с условием?

65
5

У меня в настоящее время есть охранное выражение:

 guard let designationQuota = Defaults.quotas.value?.designationQuota, designationQuota > 0 else {
return AppDelegate.shared.presentNoDesignationQuotaWarning()
}

однако я хочу сделать защитный блок только в том случае, если переменная needsQuota == true. Я хочу пропустить охранное выражение, если needsQuota == false. Есть ли более хороший способ сделать это, чем оператор if с возвратом?

РЕДАКТИРОВАТЬ:

Как мне упростить это в одну охрану?

if needsQuota {
guard let designationQuota = Defaults.quotas.value?.designationQuota, designationQuota > 0 else {
return AppDelegate.shared.presentNoDesignationQuotaWarning()
}
}

спросил(а) 2021-01-19T14:50:12+03:00 9 месяцев, 1 неделя назад
1
Решение
66

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

if needsQuota && (Defaults.quotas.value?.designationQuota ?? 0 <= 0) {
return AppDelegate.shared.presentNoDesignationQuotaWarning()
}

ответил(а) 2021-01-19T14:50:12+03:00 9 месяцев, 1 неделя назад
65

Как насчет:


guard !needsQuota ||
(Defaults.quotas.value?.designationQuota.map { $0 > 0 } == true) else {
return AppDelegate.shared.presentNoDesignationQuotaWarning()
}

ответил(а) 2021-01-19T14:50:12+03:00 9 месяцев, 1 неделя назад
46

Разве это не поможет?

guard needsQuota, let designationQuota = Defaults.quotas.value?.designationQuota, designationQuota > 0 else {
return AppDelegate.shared.presentNoDesignationQuotaWarning()
}

ответил(а) 2021-01-19T14:50:12+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема