Как элегантно совместить оператор Guard с условием?

В настоящее время у меня есть заявление охранника:

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

person Kex    schedule 10.01.2019    source источник
comment
Какая переменная needsQuota, что мне здесь не хватает?   -  person Joakim Danielson    schedule 10.01.2019


Ответы (3)


Как насчет :

guard !needsQuota ||
    (Defaults.quotas.value?.designationQuota.map { $0 > 0 } == true) else {
    return AppDelegate.shared.presentNoDesignationQuotaWarning()
}
person ielyamani    schedule 10.01.2019
comment
@MartinR Да :p Это больше похоже на позу йоги - person ielyamani; 10.01.2019

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

if needsQuota && (Defaults.quotas.value?.designationQuota ?? 0 <= 0) {
    return AppDelegate.shared.presentNoDesignationQuotaWarning()
}
person Dávid Pásztor    schedule 10.01.2019

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

guard needsQuota, let designationQuota = Defaults.quotas.value?.designationQuota, designationQuota > 0 else {
    return AppDelegate.shared.presentNoDesignationQuotaWarning()
}
person henrik-dmg    schedule 10.01.2019