Swift - 可选日期比较

Posted

技术标签:

【中文标题】Swift - 可选日期比较【英文标题】:Swift - optional dates comparison 【发布时间】:2016-01-02 18:14:14 【问题描述】:

我正在尝试快速实现代码,这将为我提供与当前日期最接近的日期。

问题是我希望用户最多选择 3 个日期,每次他选择的日期都会添加到名为“提醒”的数组中

然后我检查这个数组中有多少项(最多 3 个)(命名为:提醒),并使用 CoreData 存储数组中的特定日期/日期:

if addObjectView.reminders.count == 1 
            newobject.firstReminder = addObjectView.reminders[0]
        
        if addObjecteView.reminders.count == 2 
            newobject.firstReminder = addObjectView.reminders[0]
            newobject.secondReminder = addObjectView.reminders[1]

        
        if addObjectView.reminders.count == 3 
            newobject.firstReminder = addObjectView.reminders[0]
            newobject.secondReminder = addObjectView.reminders[1]
            newobject.thirdReminder = addObjectView.reminders[2]
        

然后我想实现代码来首先检查来自 CoreData 的第一个/第二个/第三个提醒是否为零,如果不是,则将其与当前日期进行比较。如果它“更大”,则将此日期的字符串设置为标签。但我也想比较他们之间的第一个/第二个/第三个提醒的日期,或者以某种方式确保第一个提醒总是早于第二个等等。

我不知道这是否有那么难,但我正在努力解决问题,但我被卡住了。

【问题讨论】:

【参考方案1】:

您应该为此使用nil coalescing operator

如果 (a ?? b) 包含一个值,则 nil 合并运算符 (a ?? b) 解包可选的 a,如果 a 为 nil,则返回默认值 b。表达式a 始终是可选类型。表达式 b 必须与存储在 a 中的类型匹配。

Source - developer.apple.com

你可以得到提醒的日期,存储在myOptionalDate,然后检查它是否为nil。如果是,那我们就做

0 > NSDate().timeIntervalSince1970

这将永远是错误的。如果它不是 nil,我们可以做相当于

myOptionalDate!.timeIntervalSince1970 > NSDate().timeIntervalSince1970

它会告诉你是否应该添加标签

if((myOptionalDate?.timeIntervalSince1970 ?? 0) > NSDate().timeIntervalSince1970)
    //add the label

什么是简写

var myInterval = 0
if(myOptionalDate != nil)
    myInterval = myOptionalDate!.timeIntervalSince1970


if(myInterval > NSDate().timeIntervalSince1970)

此外,虽然这与问题无关,但取决于您的代码的格式,您不应该使用 if 语句来检查有多少提醒

默认情况下,newobject.firstRemindernewobject.secondRemindernewobject.thirdReminder 将(我假设)为零。因此,您可以将所有示例代码更改为

let originalReminders = addObjectView.reminders
newobject.firstReminder = originalReminders.count > 0 ? originalReminders[0] : nil
newobject.secondReminder = originalReminders.count > 1 ? originalReminders[1] : nil
newobject.thirdReminder = originalReminders.count > 2 ? originalReminders[2] : nil

如果默认值不为零,您可以简单地将上面代码中的nil 替换为您的默认值

【讨论】:

完美的想法,使用 NSTimeIntervalSince1970!谢谢!

以上是关于Swift - 可选日期比较的主要内容,如果未能解决你的问题,请参考以下文章

如何比较Swift 3.2中的两个日期?

Swift日期比较函数 记录下 Comparing date in Swift

PHP中比较两个时间的大小与日期的差值

Swift 日期处理库 SwiftDate

如何在 Swift 中使用 Codable 转换带有可选小数秒的日期字符串?

Swift转换字符串到日期输出错误的日期