Swift 实现了 Measurement
类型,可用于以所需的度量单位保存速度、高度等值。
例如:
// Going to explicitly type here so the question is clear
var speed: Measurement<UnitSpeed> = Measurement(value: 10, unit: UnitSpeed.metersPerSecond)
var altitude: Measurement<UnitLength> = Measurement(value: 500, unit: UnitLength.meters)
altitude.convert(to: UnitLength.feet)
print("500 meters is roughly \(Int(altitude.value)) feet")
// Prints: 500 meters is roughly 1640 feet
然而,尽管
UnitLength
和UnitSpeed
都是Unit
的子类,但在Swift中无法将使用这些类型的测量值多态地传递给函数。例如,如果你传入Measurement<UnitLength>
或Measurement<UnitSpeed>
类型的对象,则以下函数不起作用。func formatMeasurementAsString(measurement: Measurement<Unit>) -> String {
return "\(Int(measurement.value)) \(measurement.unit.symbol)"
}
将上述代码中定义的
speed
或altitude
传入此函数会产生以下错误:无法将类型为“Measurement<UnitSpeed>”的值转换为预期参数类型“Measurement<Unit>”
。
编辑:
因此,在此示例中,您可以显式地将speed
和altitude
都指定为类型Measurement<Unit>
。但是,如果这样做,则它们将失去非常有用的.convert(to:)
函数,除非在转换之前将它们强制转型回Measurement<UnitLength>
,否则不太有帮助。
formatMeasurementAsString
这样的函数会削弱使用Measurement
带来的99% 的好处,也就是使用MeasurementFormatter
。 - Alexander