Swift 如何更好地构造此代码?

Swift 如何更好地构造此代码?,swift,Swift,我真的很想知道,在课堂上,对于这样一项任务,你能做的更多,因为现在我很震惊,我的回答不足以回答这家公司的面试问题。他们让我去约会,看看是不是在今天和5天前。所以,让我知道这里还有多少工作要做 相关日期被传递给函数。该函数取今天的日期,然后比较今天日期前5天的相关日期。如果所讨论的日期是从5天前开始上升的,然后如果日期是从今天开始下降的,则函数返回true。所以有人告诉我哪里出了问题 func compareDate(thisDate:Date,aheadOfDate:Date, beforeTh

我真的很想知道,在课堂上,对于这样一项任务,你能做的更多,因为现在我很震惊,我的回答不足以回答这家公司的面试问题。他们让我去约会,看看是不是在今天和5天前。所以,让我知道这里还有多少工作要做

相关日期被传递给函数。该函数取今天的日期,然后比较今天日期前5天的相关日期。如果所讨论的日期是从5天前开始上升的,然后如果日期是从今天开始下降的,则函数返回true。所以有人告诉我哪里出了问题

func compareDate(thisDate:Date,aheadOfDate:Date, beforeThisDate:Date) -> Bool{
    if( thisDate < aheadOfDate){
        return false
    }
    if(thisDate > beforeThisDate){
        return false
    }
    return true
}

func daysFromToday(days:Int) -> Date{

    let calendar = Calendar.current
    let newDate = calendar.date(byAdding: .day, value: days, to:  Date.init())
    return newDate!
}

let todaysDate = Date.init()
let fiveDaysAgo = daysFromToday(days:-5)

print(compareDate(thisDate: daysFromToday(days: 1), aheadOfDate: fiveDaysAgo, beforeThisDate: todaysDate))
func compareDate(thisDate:Date,aheadoftate:Date,beforeThisDate:Date)->Bool{
如果(此日期<提前日期){
返回错误
}
如果(thisDate>在此日期之前){
返回错误
}
返回真值
}
func daysFromToday(days:Int)->Date{
让calendar=calendar.current
让newDate=calendar.date(通过添加:.day,值:days,to:date.init())
返回newDate!
}
让todaysDate=Date.init()
从今天起让五天=天(天:-5)
打印(比较日期(此日期:从今天开始的日期(日期:1),A开始日期:五天,在此日期之前:今天)

从今天的日期中减去给定的日期,看看天数差是否在0到5之间会更简单。此外,IDK(如果他们关心的话),但是
compareDate
函数可以改为一行布尔解释。

从今天的日期减去给定日期,看看天数的差值是否在0和5之间,会更简单。另外,IDK,如果他们关心的话,但是
compareDate
函数可以改为一行布尔解释。

我使您的代码稍微短了一点,并且更加“快速”

func compare(日期thisDate:date,aheadOf aheadOfDate:date,beforeDate:date之前)->Bool{
返回日期(thisDate>aheadOfDate)&(thisDate日期{
让今天=日期()
返回日期(timeIntervalSince1970:today.timeIntervalSince1970+(天*86400.0))//以秒为单位的今天的日期+以秒为单位的一天乘以所需的天数
}
让今天=日期()
从今天开始(天数:-5天)
let one day fromToday=fromToday(天数:1)
打印(比较(日期:从今天算起的一天,日期:从今天算起,日期:从今天算起)

我将您的代码缩短了一点,更“快速”

func compare(日期thisDate:date,aheadOf aheadOfDate:date,beforeDate:date之前)->Bool{
返回日期(thisDate>aheadOfDate)&(thisDate日期{
让今天=日期()
返回日期(timeIntervalSince1970:today.timeIntervalSince1970+(天*86400.0))//以秒为单位的今天的日期+以秒为单位的一天乘以所需的天数
}
让今天=日期()
从今天开始(天数:-5天)
let one day fromToday=fromToday(天数:1)
打印(比较(日期:从今天算起的一天,日期:从今天算起,日期:从今天算起)
第一个功能 我将在
日期
重组为一个扩展:

extension Date {
    func isBetween(_ first: Date, and second: Date) -> Bool {
        return first < self && self < second
    }
}
第二功能 我还将在
Date
上重组为一个扩展,我将内联
calendar
newDate
,因为它们增加了视觉混乱,而不提供任何新信息。我还将用
Date()
替换
Date.init()

用法 在最后一段中,我将使用以下函数:

let now = Date()
let fiveDaysAgo = now.offset(days: -5)

print(now.offset(days: +1).isBetween(fiveDaysAgo, and: now))
第一功能 我将在
日期
重组为一个扩展:

extension Date {
    func isBetween(_ first: Date, and second: Date) -> Bool {
        return first < self && self < second
    }
}
第二功能 我还将在
Date
上重组为一个扩展,我将内联
calendar
newDate
,因为它们增加了视觉混乱,而不提供任何新信息。我还将用
Date()
替换
Date.init()

用法 在最后一段中,我将使用以下函数:

let now = Date()
let fiveDaysAgo = now.offset(days: -5)

print(now.offset(days: +1).isBetween(fiveDaysAgo, and: now))

我认为目前的答案缺少的是,如果你想比较日期,你需要把时间从等式中去掉(这与不关心时间不同)。所以对于这个面试问题,你真正想说的是‘我正在检查的日期是五天前的开始日期还是明天开始之前’。毕竟,如果你是在今天晚上10点检查,那么5天前上午9点仍然可以,但如果你在所有检查中都包括时间,就不行了

因此,在进行任何检查之前,您需要计算5天前和明天的一天开始时间,如下所示:

    let now = Date()

    let cal = Calendar.current
    var start = cal.startOfDay(for: Date())
    let inYesterday = cal.date(byAdding: .day, value: -5, to: now)!
    start = cal.startOfDay(for: inYesterday)

    var end = cal.startOfDay(for: Date())
    let inTomorrow = cal.date(byAdding: .day, value: 1, to: now)!
    end = cal.startOfDay(for: inTomorrow)
extension Date {
    func isBetween(date: Date, andDaysAgo daysAgo: Int) -> Bool {
        let cal = Calendar.current
        var start = cal.startOfDay(for: date)
        let inYesterday = cal.date(byAdding: .day, value: -daysAgo, to: date)!
        start = cal.startOfDay(for: inYesterday)

        var end = cal.startOfDay(for: date)
        let inTomorrow = cal.date(byAdding: .day, value: 1, to: date)!
        end = cal.startOfDay(for: inTomorrow)

        return start..<end ~= self
    }
}
var checkDate = Date(timeIntervalSinceNow: 3600 * 24 * 0)
print (checkDate.isBetween(date: Date(), andDaysAgo: 5) // prints true
checkDate = Date(timeIntervalSinceNow: 3600 * 24 * -5)
print (checkDate.isBetween(date: Date(), andDaysAgo: 5) // prints true
checkDate = Date(timeIntervalSinceNow: 3600 * 24 * 1)
print (checkDate.isBetween(date: Date(), andDaysAgo: 5) // prints false
checkDate = Date(timeIntervalSinceNow: 3600 * 24 * -6)
print (checkDate.isBetween(date: Date(), andDaysAgo: 5) // prints flase
(这比你想象的要复杂得多,因为你必须考虑不同的时区和格式,以及像夏季这样的事情。)

然后,根据您想如何使用它,您可以执行以下操作:

    let now = Date()

    let cal = Calendar.current
    var start = cal.startOfDay(for: Date())
    let inYesterday = cal.date(byAdding: .day, value: -5, to: now)!
    start = cal.startOfDay(for: inYesterday)

    var end = cal.startOfDay(for: Date())
    let inTomorrow = cal.date(byAdding: .day, value: 1, to: now)!
    end = cal.startOfDay(for: inTomorrow)
extension Date {
    func isBetween(date: Date, andDaysAgo daysAgo: Int) -> Bool {
        let cal = Calendar.current
        var start = cal.startOfDay(for: date)
        let inYesterday = cal.date(byAdding: .day, value: -daysAgo, to: date)!
        start = cal.startOfDay(for: inYesterday)

        var end = cal.startOfDay(for: date)
        let inTomorrow = cal.date(byAdding: .day, value: 1, to: date)!
        end = cal.startOfDay(for: inTomorrow)

        return start..<end ~= self
    }
}
var checkDate = Date(timeIntervalSinceNow: 3600 * 24 * 0)
print (checkDate.isBetween(date: Date(), andDaysAgo: 5) // prints true
checkDate = Date(timeIntervalSinceNow: 3600 * 24 * -5)
print (checkDate.isBetween(date: Date(), andDaysAgo: 5) // prints true
checkDate = Date(timeIntervalSinceNow: 3600 * 24 * 1)
print (checkDate.isBetween(date: Date(), andDaysAgo: 5) // prints false
checkDate = Date(timeIntervalSinceNow: 3600 * 24 * -6)
print (checkDate.isBetween(date: Date(), andDaysAgo: 5) // prints flase
(这些只是快速黑客攻击的例子)

编辑

正如向我指出的那样(非常正确),如果你在比较日期而不在乎时间,那么你可以使用中午作为参考点(基本上它总是固定的,不受夏令时变化等因素的影响)。所以这是一种方法:

func isBetweenAlt(date: Date, andDaysAgo daysAgo: Int) -> Bool {
    let cal = Calendar.current
    let startCheck = cal.date(bySettingHour: 12, minute: 0, second: 0, of: cal.date(byAdding: .day, value: -daysAgo, to: date)!)!
    let endCheck = cal.date(bySettingHour: 12, minute: 0, second: 0, of: date)!
    let checkDate = cal.date(bySettingHour: 12, minute: 0, second: 0, of: self)!

    return startCheck...endCheck ~= checkDate
}
本着学习的精神,这里还有其他几种方法:

func isBetweenAlt2(date: Date, andDaysAgo daysAgo: Int) -> Bool {
    let cal = Calendar.current
    let startCheck = cal.date(byAdding: .day, value: -(daysAgo + 1), to: date)! // You have to offset by one day as the test will be > not >=
    let endCheck = cal.date(byAdding: .day, value: 1, to: date)! // You have to offset by one day as the test will be < not <=

    return cal.compare(startCheck, to: self, toGranularity: .day) == .orderedAscending && cal.compare(endCheck, to: self, toGranularity: .day) == .orderedDescending
}

func isBetweenAlt3(date: Date, andDaysAgo daysAgo: Int) -> Bool {
    let cal = Calendar.current
    let startCheck = cal.ordinality(of: .day, in: .era, for: cal.date(byAdding: .day, value: -daysAgo, to: date)!)!
    let endCheck = cal.ordinality(of: .day, in: .era, for: date)!
    let check = cal.ordinality(of: .day, in: .era, for: self)!

    return startCheck...endCheck ~= check
}
func介于2(日期:date和daysAgo-daysAgo:Int)->Bool之间{
设cal=Calendar.current
让startCheck=cal.date(通过添加:.day,value:-(daysAgo+1),to:date)!//您必须偏移一天,因为测试将>不>=
让endCheck=cal.date(通过添加:.day,值:1,to:date)!//您必须偏移一天,因为测试将
他们都做同样的工作(我想)