Date.addingTimeInterval(_:) 和 Date.advanced(by:) 有什么区别?

mre*_*dig 2 foundation swift

Foundation 的Datestruct 提供了Date.addingTimeInterval(_:)Date.advanced(by:),它们在功能上看起来是相同的,但显然是不同的方法。它们之间实际上有区别还是它们最终相同?

查看文档,advanced(by:)什么都没有,addingTimeInterval(_:)只说

要添加的值,以秒为单位。

与 NSDate 相比,advanced(by:)完全缺失。剧情变厚了!

Rob*_*ier 5

.addingTimeInterval(_:)是一个长期存在的方法,来自 ObjC NSDate。.advanced(by:)存在以匹配 Swift 中的 Strideable 一致性。Date 同样具有 Stride 类型别名。

也就是说, Date 实际上并不符合 Strideable ,这已被讨论并普遍拒绝

Strideable 伪一致性似乎已作为Xcode 11.4 大型合并的一部分添加到一个名为Schedulers+DateCombine的扩展中(该扩展不是开源的)。我在论坛上没有看到任何关于它的讨论,除了一个说明它破坏了现有代码。变更说明:

// Date cannot conform to Strideable per rdar://35158274
@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
 extension Date /* : Strideable */ {
Run Code Online (Sandbox Code Playgroud)

我的预感是在 Combine 内部的某个地方,有 Date 到 Strideable 的追溯一致性。您只需提出要求即可获得相同的结果:

extension Date: Strideable {}
Run Code Online (Sandbox Code Playgroud)

感觉就像 Swift stdlib 团队接受 Date 不应该是 Strideable(我同意这个推理,因为它会引起很多常见的日期错误),但 Apple 的其他一些团队想要它并且无论如何都将钩子放入 stdlib,没有放入一致性。

  • 它们实际上都是使用“+”实现的。你使用哪一种确实是一个品味问题。就我个人而言,我总是使用“addingTimeInterval”,因为它是传统名称,而且在我看来,“date.advanced(by: 4)”和“date + 4”都是可怕的语法。这里的“4”是什么?秒?毫秒?纳秒?如果我对 Cocoa 没有深入的经验,我会期望 `date + 4` 添加 4 *天* (它就在那里说“日期”!) TimeInterval 被定义为 *总是* 秒,所以当它说时很清楚“添加时间间隔。” 在我看来,其他一切都是非常常见的错误的根源。但其他人可能不同意。 (2认同)