Date.addingTimeInterval(_:)和Date.advanced(by:)有什么区别?
Foundation 的Datestruct 提供了Date.addingTimeInterval(_:)和Date.advanced(by:),它们在功能上看起来是相同的,但显然是不同的方法。它们之间实际上有区别还是它们最终相同?
查看文档,advanced(by:)什么都没有,addingTimeInterval(_:)只说
要添加的值,以秒为单位。
与 NSDate 相比,advanced(by:)完全缺失。剧情变厚了!
回答
.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 */ {
我的预感是在 Combine 内部的某个地方,有 Date 到 Strideable 的追溯一致性。您只需提出要求即可获得相同的结果:
extension Date: Strideable {}
感觉就像 Swift stdlib 团队接受 Date 不应该是 Strideable(我同意这个推理,因为它会引起很多常见的日期错误),但 Apple 的其他一些团队想要它并且无论如何都将钩子放入 stdlib,没有放入一致性。
THE END
二维码