Как элегантно сочетать охранное заявление с условием? - PullRequest
0 голосов
/ 10 января 2019

У меня сейчас есть защитное заявление:

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

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

EDIT:

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

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

Ответы [ 3 ]

0 голосов
/ 10 января 2019

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

if needsQuota && (Defaults.quotas.value?.designationQuota ?? 0 <= 0) {
    return AppDelegate.shared.presentNoDesignationQuotaWarning()
}
0 голосов
/ 10 января 2019

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

guard needsQuota, let designationQuota = Defaults.quotas.value?.designationQuota, designationQuota > 0 else {
    return AppDelegate.shared.presentNoDesignationQuotaWarning()
}
0 голосов
/ 10 января 2019

Как насчет:

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