如何在此(下方)情况下减少if语句的数量?我知道switch语句,但无法想象在这种情况下这会有什么帮助。
以下是发生的事情:
最后,如果#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()
}
答案 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'")
}
}