You can use Measurement and UnitDuration to convert a TimeInterval value into any duration unit. To see milliseconds in the result you need UnitDuration.milliseconds that requires iOS 13.0, tvOS 13.0, watchOS 6.0 or macOS 10.15. I put all actions that should be done in func convertDurationUnitValueToOtherUnits(durationValue:durationUnit:smallestUnitDuration:) (Swift 5.1.3/Xcode 11.3.1):
import Foundation
@available(iOS 10.0, tvOS 10.0, watchOS 3.0, macOS 10.12, *)
func convert<MeasurementType: BinaryInteger>(
    measurementValue: Double, unitDuration: UnitDuration, smallestUnitDuration: UnitDuration
) -> (MeasurementType, Double) {
    let measurementSmallest = Measurement(
        value: measurementValue,
        unit: smallestUnitDuration
    )
    let measurementSmallestValue = MeasurementType(measurementSmallest.converted(to: unitDuration).value)
    let measurementCurrentUnit = Measurement(
        value: Double(measurementSmallestValue),
        unit: unitDuration
    )
    let currentUnitCount = measurementCurrentUnit.converted(to: smallestUnitDuration).value
    return (measurementSmallestValue, measurementValue - currentUnitCount)
}
@available(iOS 10.0, tvOS 10.0, watchOS 3.0, macOS 10.12, *)
func convertDurationUnitValueToOtherUnits<MeasurementType: BinaryInteger>(
    durationValue: Double,
    durationUnit: UnitDuration,
    smallestUnitDuration: UnitDuration
) -> [MeasurementType] {
    let basicDurationUnits: [UnitDuration] = [.hours, .minutes, .seconds]
    let additionalDurationUnits: [UnitDuration]
    if #available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) {
        additionalDurationUnits = [.milliseconds, .microseconds, .nanoseconds, .picoseconds]
    } else {
        additionalDurationUnits = []
    }
    let allDurationUnits = basicDurationUnits + additionalDurationUnits
    return sequence(
        first: (
            convert(
                measurementValue: Measurement(
                    value: durationValue,
                    unit: durationUnit
                ).converted(to: smallestUnitDuration).value,
                unitDuration: allDurationUnits[0],
                smallestUnitDuration: smallestUnitDuration
            ),
            0
        )
    ) {
        if allDurationUnits[$0.1] == smallestUnitDuration || allDurationUnits.count <= $0.1 + 1 {
            return nil
        } else {
            return (
                convert(
                    measurementValue: $0.0.1,
                    unitDuration: allDurationUnits[$0.1 + 1],
                    smallestUnitDuration: smallestUnitDuration
                ),
                $0.1 + 1
            )
        }
    }.compactMap { $0.0.0 }
}
This is how you can call it:
let intervalToConvert: TimeInterval = 12345.67
let result: [Int] = convertDurationUnitValueToOtherUnits(
    durationValue: intervalToConvert,
    durationUnit: .seconds,
    smallestUnitDuration: .milliseconds
)
print("\(result[0]) hours, \(result[1]) minutes, \(result[2]) seconds, \(result[3]) milliseconds") // 3 hours, 25 minutes, 45 seconds, 670 milliseconds
As you can see I did not use numeric constants like 60 and 1000 to get the result.