如何优雅地将保护语句与条件结合起来?

Posted

技术标签:

【中文标题】如何优雅地将保护语句与条件结合起来?【英文标题】:How to elegantly combine a guard statement with a condition? 【发布时间】:2019-01-10 11:39:12 【问题描述】:

我目前有保护声明:

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

但是我只有想要在变量needsQuota == true 时执行保护块。如果needsQuota == false,我想跳过守卫语句。有没有比带有 return 的 if 语句更好的方法呢?

编辑:

如何将其简化为单个守卫?

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

【问题讨论】:

什么变量needsQuota,我在这里缺少什么? 【参考方案1】:

怎么样:

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

【讨论】:

@MartinR Yes :p 这感觉更像是瑜伽姿势【参考方案2】:

问题在于,如果您的if 条件失败或guard 失败,您希望以不同的方式继续执行,因此您不能真正将它们组合成一个guard。但是,您可以通过将您的 guard 条件的否定版本放入 if 语句中,将这两个条件组合成一个 if 语句。

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

【讨论】:

【参考方案3】:

这不就行了吗?

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

【讨论】:

以上是关于如何优雅地将保护语句与条件结合起来?的主要内容,如果未能解决你的问题,请参考以下文章

优雅的替换if-else语句

如何优雅地将Jenkins和Kubernetes集成

如何优雅地将 ember 哈希位置重定向到历史位置

Python中如何优雅地使用switch语句

es6之更优雅的条件语句

如何优雅地将代码块插入到Word,只需要一步!