Защита Swift 2.1 против если позволить

В этом примере, какое соглашение было бы подходящим для использования?

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
}

person mattgabor    schedule 22.11.2015    source источник


Ответы (2)


Вот что я бы сделал:

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

Кстати. так как ваш код всегда возвращает действительный NSRect, вы можете вернуть NSRect вместо NSRect?

person MirekE    schedule 22.11.2015

В вашем примере это действительно не имеет значения, потому что вы не используете windowSize нигде, кроме возврата. Но если у вас будет больше кода с использованием windowSize, выполнение все большего количества if let продвинет вашу вкладку кода дальше. Также вам нужно помнить, когда заканчивается область с этой переменной, что иногда может быть сложно. Guard позволяет упростить поток, поскольку вы уверены, что значение windowSize является правильным во всем блоке, а не только в положительном блоке if let.

Но чтобы упростить ваш текущий код, поскольку вы возвращаете необязательный параметр, в случае, если вы не можете получить размер окна, вы можете вернуть 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
    }
}
person sunshinejr    schedule 22.11.2015
comment
Если вы можете жить без print, это сокращается до return scene.view?.bounds. - person vacawama; 22.11.2015
comment
Ага, догадался, что отпечаток здесь нужен для его отладки ^^ - person sunshinejr; 22.11.2015