代码之家  ›  专栏  ›  技术社区  ›  lurning too koad

必须分解保护语句以防止额外的计算?

  •  2
  • lurning too koad  · 技术社区  · 7 年前

    如果某些保护声明比其他声明更重要,是否有必要将其分解?例如:

    guard let someProperty = someProperty,
        someProperty < someValue else {
            return
    }
    
    // if some property is OK, unwrap other properties
    
    guard let anotherProperty = anotherProperty,
        let moreProperties = moreProperties else {
            return
    }
    

    上面的例子毫无疑问地阻止了任何不必要的拆解,如果 someProperty 不符合谓词。然而,如果它们被结合起来,同样数量的工作会被完成吗?

    guard let someProperty = someProperty,
        someProperty < someValue,
        let anotherProperty = anotherProperty,
        let moreProperties = moreProperties else {
            return
    }
    

    显然,这个过程将从上到下运行,但是机器运行整个保护,然后评估完成或失败,还是机器在第一个失败的子句中退出保护?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Damiaan Dufaux    7 年前

    没有必要把这些陈述分开。

    您可以通过执行以下代码轻松地检查这一点:

    var condition = false
    func failingTest() -> Bool {
      fatalError("this should never execute")
    }
    guard condition, failingTest() else {
      print("Early exit")
      return
    }
    
    • 当这张照片 Early exit 你知道,在打印出早期出口之前,它没有评估防护装置的所有条件。
    • 当这引发致命错误时,您知道它执行了 failingTest 即使它知道 condition 是假的。

    执行此代码段时使用 Apple Swift version 4.2.1 我们得到 提前退出 所以我们知道,在第一个条件被评估为 false .

    通常你应该能够在 language reference . 但在这种情况下,参考文献中还没有提到您问题的答案。希望将来有人能加入。

        2
  •  1
  •   koen    7 年前

    guard语句的工作方式为:如果第一个谓词是 false 它将 not 计算下一个谓词。

    换句话说,你可以考虑逗号 , 守卫声明与 && 操作员。这就是我们所说的 懒惰的 评估;如果你检查如何 && works ,您会注意到 rhs 是一个 自动关闭 返回布尔值,但 一个布尔值,这意味着它甚至可能不会被计算(在 lhs 参数是 )

    想了解更多关于自动关闭的信息吗?检查 this 出去!

    因此,对于您的情况,您可以将所有谓词(我认为它在IMO中更具可读性)组合在一起 guard 语句。