Swift 2.1后卫vs.如果让

时间:2015-11-22 02:11:18

标签: swift swift2 optional

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

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

OR

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

2 个答案:

答案 0 :(得分:3)

这就是我要做的事情:

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

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

答案 1 :(得分: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
    }
}