Как я могу изменить DispatchTimeInterval, чтобы иметь член миллисекунд - PullRequest
0 голосов
/ 13 октября 2019

В моем коде я получаю ошибку «Значение типа DispatchTimeInterval» не имеет члена «миллисекунда» », и я не знаю, как это исправить

var prevTime = DispatchTime.now()
let dt = prevTime.distance(to: currTime).millisecond

1 Ответ

0 голосов
/ 13 октября 2019

DispatchTimeInterval не имеет свойства экземпляра с именем milliseconds. Это enum и имеет case с именем milliseconds. Вы можете добавить свойство milliseconds в расширение. Но поскольку DispatchTimeInterval может представлять интервал, измеряемый в микросекундах или наносекундах, вам нужно решить, как вы хотите преобразовать эти интервалы в миллисекунды. Он также может представлять бесконечный интервал, и вы должны решить, как преобразовать его в миллисекунды.

Вот простая реализация, которая округляет микро и нанос до нуля и возвращает Int.max для бесконечного интервала:

extension DispatchTimeInterval {
    var milliseconds: Int {
        switch self {
        case .seconds(let s): return s * 1_000
        case .milliseconds(let ms): return ms
        case .microseconds(let us): return us / 1_000 // rounds toward zero
        case .nanoseconds(let ns): return ns / 1_000_000 // rounds toward zero
        case .never: return .max
        }
    }
}

Вместо этого вы можете округлить до ближайшего и вернуть nil для бесконечного интервала:

extension DispatchTimeInterval {
    var milliseconds: Int? {
        switch self {
        case .seconds(let s): return s * 1_000
        case .milliseconds(let ms): return ms
        case .microseconds(let us): return (us + 500) / 1_000
        case .nanoseconds(let ns): return (ns + 500_000) / 1_000_000
        case .never: return nil
        }
    }
}
...