Swift 2.1 guard срещу if let

В този пример коя би била подходящата конвенция за използване?

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 никъде друго освен return. Но ако искате да имате малко повече код, използвайки windowSize, правенето на все повече и повече if let избутва раздела с кода ви още повече. Също така трябва да запомните кога обхватът с тази променлива завършва, което понякога може да е трудно. Guard ви позволява да поддържате потока прост, тъй като сте сигурни, че windowSize е правилната стойност в целия блок, не само в if let положителния блок.

Но за да опростите текущия си код, тъй като връщате опция, в случай че не можете да получите размера на прозореца, можете да върнете нула вместо празно 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