【问题标题】:Swift 2.1 guard vs. if letSwift 2.1 守卫与 if let
【发布时间】:2015-11-22 02:11:17
【问题描述】:

在这个例子中,哪个是合适的约定?

static func getWindowSize(scene: SKScene) -> NSRect? {
    if let windowSize = scene.view?.bounds {
        return windowSize
    } else {
        print("Could not get window size")
    }
    return NSRect()
}

static func getWindowSize(scene: SKScene) -> NSRect? {
    guard let windowSize = scene.view?.bounds else {
        print("Could not get window size")
        return NSRect()
    }
    return windowSize
}

【问题讨论】:

    标签: swift swift2 optional


    【解决方案1】:

    这就是我会做的:

    static func getWindowSize(scene: SKScene) -> NSRect? {
        return scene.view?.bounds ?? NSRect()
    }
    

    顺便说一句。由于您的代码始终返回有效的NSRect,因此您可以返回NSRect 而不是NSRect?

    【讨论】:

      【解决方案2】:

      在您的示例中,这实际上没有区别,因为除了返回之外,您没有在任何地方使用windowSize。但是,如果您要使用windowSize 编写更多代码,那么执行更多if let 会进一步推动您的代码选项卡。此外,您还需要记住该变量的作用域何时结束,这有时可能很困难。 Guard 让您保持流程简单,因为您确定 windowSize 在整个块中是正确的值,而不仅仅是在 if let 正块中。

      但是为了简化您当前的代码,因为您返回一个 Optional,如果您无法获得窗口大小,您可以返回 nil 而不是空的 NSRect()

      您的guard 示例没问题(您可以将return NSRect() 更改为return nil),但在if let 中我会将其更改为:

      static func getWindowSize(scene: SKScene) -> NSRect? {
          if let windowSize = scene.view?.bounds {
              return windowSize
          } else {
              print("Could not get window size")
              return nil
          }
      }
      

      【讨论】:

      • 如果你可以不用print,这将减少到return scene.view?.bounds
      • 是的,他的调试需要打印出来^^
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      相关资源
      最近更新 更多