减少嵌套If-Statements的数量

时间:2016-02-26 16:46:29

标签: swift if-statement

如何在此(下方)情况下减少if语句的数量?我知道switch语句,但无法想象在这种情况下这会有什么帮助。

以下是发生的事情:

  1. 第一个IF安全地检查存储在NSDefault中的日期,可能存在也可能不存在
  2. 如果日期存在(true),则会检查日期是否在“now”之前
  3. 如果日期在“now”之前(true),它会安全地检查NSDefault中的On / Off用户首选项,这也可能存在也可能不存在
  4. 如果确实存在,则会检查它是否等于关闭
  5. 最后,如果#4为真,则调用该函数

    //Queue up more quote notifications?
    if let notif_EndDate = (userPref_NSDefault.objectForKey("notification_EndDate")) as? NSDate {
        if notif_EndDate.isLessThanDate(self.now) {
            if let quoteNotif_Pref = (userPref_NSDefault.stringForKey("WeeklyQuote_Pref")) {
                if quoteNotif_Pref != "Off" {
                    quoteNotifications()
                } else {
                    print("Use has set 'Weekly Quotes' to 'Off'")
                }
            } else {
                quoteNotifications()
            }
        }
    } else {
        quoteNotifications()
    }
    

4 个答案:

答案 0 :(得分:4)

您可以使用guard声明:

//Queue up more quote notifications?
guard let notif_EndDate = (userPref_NSDefault.objectForKey("notification_EndDate")) as? NSDate
    where notif_EndDate.isLessThanDate(self.now) else {
    quoteNotifications()
    return
}
guard let quoteNotif_Pref = (userPref_NSDefault.stringForKey("WeeklyQuote_Pref"))
    where if quoteNotif_Pref != "Off" else {
    quoteNotifications()
    return
}
print("Use has set 'Weekly Quotes' to 'Off'")

注意:这是您的代码的直接翻译,但不是我的设计方式。 guard语句用于检查范围是否满足某些条件,如果不满足则提前返回。理想情况下,您最后会进行queueNotifications()来电。

答案 1 :(得分:4)

您可以在switch语句中使用模式匹配:

switch ( userPref_NSDefault.objectForKey("notification_EndDate"), userPref_NSDefault.stringForKey("WeeklyQuote_Pref") )
{
    case let (date as NSDate, weeklyPref) where date.compare( NSDate() ) == .OrderedAscending && weeklyPref == "Off":
        print("User has set 'Weekly Quotes' to 'Off'")
    default:
        quoteNotifications()
}

你也可以链接你的可选绑定(基于@Patrick Stephen的回答)

if let notif_EndDate = userPref_NSDefault.objectForKey("notification_EndDate") as? NSDate, 
    quoteNotif_Pref = userPref_NSDefault.stringForKey("WeeklyQuote_Pref") as? String
{
    if notif_EndDate.isLessThanDate(self.now) && quoteNotif_Pref == "Off" 
    {
        print("Use has set 'Weekly Quotes' to 'Off'")
        return
    }
}
quoteNotifications() 

答案 2 :(得分:1)

第一步涉及不重复quoteNotifications()调用。

它不会减少if语句,但会减少else语句。

//Queue up more quote notifications?
if let notif_EndDate = (userPref_NSDefault.objectForKey("notification_EndDate")) as? NSDate {
    if notif_EndDate.isLessThanDate(self.now) {
        if let quoteNotif_Pref = (userPref_NSDefault.stringForKey("WeeklyQuote_Pref")) {
            if quoteNotif_Pref == "Off" {
                print("Use has set 'Weekly Quotes' to 'Off'")
                return
            }
        } 
    }
}
quoteNotifications() 

答案 3 :(得分:1)

您可以将if-let语句更改为guard语句

guard let notif_EndDate = (userPref_NSDefault.objectForKey("notification_EndDate")) as? NSDate else { quoteNotifications() }

if notif_EndDate.isLessThanDate(self.now) {
    guard let quoteNotif_Pref = (userPref_NSDefault.stringForKey("WeeklyQuote_Pref")) else { quoteNotifications() }

    if quoteNotif_Pref != "Off" {
        quoteNotifications()
    } else {
        print("Use has set 'Weekly Quotes' to 'Off'")
    }
}