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,而不放入一致性。
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,而不放入一致性。