【问题标题】:Using customized setter/getter and initializing the property for a swift date使用自定义的 setter/getter 并为快速日期初始化属性
【发布时间】:2023-06-29 14:42:02
【问题描述】:

我有一个名为Trip 的类,它有一个名为dateNSDate 属性。我的愿望是确保date 属性始终将时间值设置为一天的开始。我这样做:

  1. 创建一个名为calendarNSCalendar 常量,以便我可以使用startOfDayForDate 方法重置日期值。
  2. 为调用 startOfDayForDate 方法的 date 属性创建自定义设置方法。

但是,我想将date 属性初始化为今天的开始日期。

我目前的代码如下所示。

class Trip {

    private let calendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!

    var date: NSDate {
        get {
            return self.date
        }
        set {
            self.date = calendar.startOfDayForDate(newValue)
        }
    }
}

这段代码 a) 没有初始化 date 属性,b)(我发现)在调用 setter 时会导致无限循环。经过进一步研究,我相信自定义的 getter/setter 是严格计算的,对吧?

我如何完成我前面提到的:

a.) 确保设置为 date 属性重置为一天的开始和

b.) 将date 属性初始化为今天的开始日期?

【问题讨论】:

  • 当你说一天的开始时,你是什么意思?您希望它返回今天的开始还是日历的开始?
  • 我希望我的日期时间一致,以确保正确的日期比较。因此,我指的是一天的开始(即零小时、零分钟、零秒)。我的理解是“startOfDateForDate”方法将提供这一点。

标签: swift nsdate


【解决方案1】:

我认为您希望有一个始终作为日期开始的日期。将您当前的 date 变量替换为:

private var privateDate = NSDate()
var date: NSDate {
    get {
        return privateDate
    }
    set {
        privateDate = calendar.startOfDayForDate(newValue)
    }
}

可能有更好的方法来做到这一点,但我猜你的应用程序不会有成千上万的 Trip 类,所以你应该没问题。

【讨论】:

  • 好吧,我得出了同样的结论,即我需要有两个变量,正如您使用 privateDatedate 演示的那样。我也可以用(NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!).startOfDayForDate(NSDate()) 初始化privateDate 属性。