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

What is the difference between Date.addingTimeInterval(_:) and Date.advanced(by:)?

Foundation 的 Date 结构同时提供了 Date.addingTimeInterval(_:)Date.advanced(by:),它们在功能上看起来是相同的,但显然是不同的方法。它们之间究竟有什么区别还是它们最终是一样的?

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

The value to add, in seconds.

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

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

也就是说,Date 实际上并不符合 Strideable,and this has been discussed and generally rejected

Strideable 伪一致性似乎已作为 a large merge from Xcode 11.4 in an extension called Schedulers+Date that appears to be part of Combine (which is not open source). I don't see any discussion of it in the forums, except for a note that it broke existing code 的一部分添加。变更说明:

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

我的直觉是,在 Combine 内部的某个地方,日期与 Strideable 具有追溯一致性。你可以通过要求得到同样的东西:

extension Date: Strideable {}

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