TimeInterval 是以秒为单位的一个 Double 值。

但在 Swift 3 中,DispatchTime和DispatchTimeInterval具有更强大的表述性和可编程性。因此存在一个迁移和合并的问题。

实际上,关于时钟、日历方面的问题是非常复杂的,但我也没耐性逐个分解,非常系统的,那太费事了,所以以下简单地贴代码来直接用好了。

extension TimeInterval {
    
    public func toDispatchTimeInterval () -> DispatchTimeInterval {
        let v : Double = self
        let vv = v.multiplied(by: Double(NSEC_PER_SEC))
        return DispatchTimeInterval.nanoseconds(Int(vv))
    }
    
    public func toDispatchTime () -> DispatchTime {
        let v : Double = self
        let vv = v.multiplied(by: Double(NSEC_PER_SEC))
        return .now() + DispatchTimeInterval.nanoseconds(Int(vv))
    }

}

由于计算属性其实更好用,所以我们实际上是采用的以下的版本:

extension TimeInterval {
    
    public var dispatchTimeInterval : DispatchTimeInterval { get {
        let v : Double = self
        let vv = v.multiplied(by: Double(NSEC_PER_SEC))
        return DispatchTimeInterval.nanoseconds(Int(vv))
        }}
    
    public var dispatchTime : DispatchTime { get {
        let v : Double = self
        let vv = v.multiplied(by: Double(NSEC_PER_SEC))
        return .now() + DispatchTimeInterval.nanoseconds(Int(vv))
        }}

}

注意到Double到Int存在截断以及损失精度问题,所以上述转换方案仅适用于小时间段,例如一个月,一周,一小时,一秒等等。