2015-11-22 2 views
0

В этом примере, что будет подходящим соглашением?Swift 2.1 guard vs. 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() 
} 

ИЛИ

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

ответ

2

В вашем примере это на самом деле нет разницы, потому что вы не используете windowSize нигде, кроме возвращения. Но если у вас будет еще какой-то код с помощью 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 
    } 
} 
+1

Если вы можете жить без 'print', это сводится к' return scene.view? .bounds'. – vacawama

+0

Да, предположил, что здесь нужен отпечаток для его отладки ^^ – sunshinejr

3

Это то, что я хотел бы сделать:

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

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

Смежные вопросы