1

I currently have the guard statement:

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

however I only want to do the guard block if the variable needsQuota == true. I want to skip the guard statement if needsQuota == false. Is there a nicer way of doing this over than an if statement with a return?

EDIT:

How do I simplify this into a single guard?

if needsQuota {
  guard let designationQuota = Defaults.quotas.value?.designationQuota, designationQuota > 0 else {
      return AppDelegate.shared.presentNoDesignationQuotaWarning()
   }
}
Kex
  • 8,023
  • 9
  • 56
  • 129

3 Answers3

1

How about :

guard !needsQuota ||
    (Defaults.quotas.value?.designationQuota.map { $0 > 0 } == true) else {
    return AppDelegate.shared.presentNoDesignationQuotaWarning()
}
ielyamani
  • 17,807
  • 10
  • 55
  • 90
1

The problem is that you want to continue execution differently in case your if condition fails or in case your guard fails, so you cannot really combine them into a single guard. However, you could combine the two conditions into an if statement by putting the negated version of your guard condition in the if statement.

if needsQuota && (Defaults.quotas.value?.designationQuota ?? 0 <= 0) {
    return AppDelegate.shared.presentNoDesignationQuotaWarning()
}
Dávid Pásztor
  • 51,403
  • 9
  • 85
  • 116
0

Wouldn‘t this do the trick?

guard needsQuota, let designationQuota = Defaults.quotas.value?.designationQuota, designationQuota > 0 else {
    return AppDelegate.shared.presentNoDesignationQuotaWarning()
}
henrik-dmg
  • 1,448
  • 16
  • 23