如何将DispatchTimeInterval转换为NSTimeInterval(或Double)?

mea*_*ers 3 nstimeinterval swift

我需要DispatchTimeIntervalNSTimeInterval(或Double)中减去一个。

是否有一个转换的标准方式DispatchTimeInterval,以一个NSTimeInterval

Ima*_*tit 6

一个快速的解决方案是创建一个TimeInterval扩展并添加一个带有参数的可失败初始值DispatchTimeInterval设定项。以下 Swift 5 代码展示了如何实现它:

import Foundation

extension TimeInterval {

    init?(dispatchTimeInterval: DispatchTimeInterval) {
        switch dispatchTimeInterval {
        case .seconds(let value):
            self = Double(value)
        case .milliseconds(let value):
            self = Double(value) / 1_000
        case .microseconds(let value):
            self = Double(value) / 1_000_000
        case .nanoseconds(let value):
            self = Double(value) / 1_000_000_000
        case .never:
            return nil
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

用法:

let dispatchTimeInterval = DispatchTimeInterval.seconds(5)
let timeInterval = TimeInterval(dispatchTimeInterval: dispatchTimeInterval)
print(String(describing: timeInterval)) // Optional(5.0)
Run Code Online (Sandbox Code Playgroud)
let dispatchTimeInterval = DispatchTimeInterval.milliseconds(30)
let timeInterval = TimeInterval(dispatchTimeInterval: dispatchTimeInterval)
print(String(describing: timeInterval)) // Optional(0.03)
Run Code Online (Sandbox Code Playgroud)


Igo*_*ets 5

DispatchTimeInterval 是一个枚举:

public enum DispatchTimeInterval : Equatable {
    case seconds(Int)
    case milliseconds(Int)
    case microseconds(Int)
    case nanoseconds(Int)
    case never
}
Run Code Online (Sandbox Code Playgroud)

您可以DispatchTimeInterval使用以下方法进行初始化:

    let tenSeconds: DispatchTimeInterval = .seconds(10)
    let tenNanoseconds: DispatchTimeInterval = .nanoseconds(10)
Run Code Online (Sandbox Code Playgroud)

要从枚举中获取值,您需要将值与枚举中的案例值匹配

    if case .seconds(let value) = tenSeconds {
        print("DispatchTimeInterval is seconds \(value)")
    } else if case .nanoseconds(let value) = tenNanoseconds {
        print("DispatchTimeInterval is seconds \(value)")
    }
Run Code Online (Sandbox Code Playgroud)

转换函数可能如下所示:

func toDouble(_ interval: DispatchTimeInterval) -> Double? {
        var result: Double? = 0

        switch interval {
        case .seconds(let value):
            result = Double(value)
        case .milliseconds(let value):
            result = Double(value)*0.001
        case .microseconds(let value):
            result = Double(value)*0.000001
        case .nanoseconds(let value):
            result = Double(value)*0.000000001

        case .never:
            result = nil
        }

        return result
    }
Run Code Online (Sandbox Code Playgroud)

有关枚举的更多信息,请参阅Apple文档。

更新:

创建扩展 DispatchTimeInterval

extension DispatchTimeInterval {
    func toDouble() -> Double? {
        var result: Double? = 0

        switch self {
        case .seconds(let value):
            result = Double(value)
        case .milliseconds(let value):
            result = Double(value)*0.001
        case .microseconds(let value):
            result = Double(value)*0.000001
        case .nanoseconds(let value):
            result = Double(value)*0.000000001

        case .never:
            result = nil
        }

        return result
    }
}
Run Code Online (Sandbox Code Playgroud)


Fab*_*b1n 3

这是一个非常简洁的解决方案(不需要 switch 语句)

extension DispatchTimeInterval {
  var nanoseconds: UInt64 {
    let now = DispatchTime.now()
    let later = now.advanced(by: self)
    return later.uptimeNanoseconds - now.uptimeNanoseconds
  }

  var timeInterval: TimeInterval {
    return Double(nanoseconds) / Double(NSEC_PER_SEC)
  }
}
Run Code Online (Sandbox Code Playgroud)