在swift中接受任何类型测量的功能

在swift中接受任何类型测量的功能,swift,polymorphism,Swift,Polymorphism,Swift实现了测量类型,可用于将速度、高度等值保持在其所需的度量中 例如: //在这里显式键入,这样问题就清楚了 var速度:测量值=测量值(值:10,单位:UnitSpeed.metersPerSecond) 变压高度:测量值=测量值(值:500,单位:单位长度。米) 高度.换算(单位长度.英尺) 打印(“500米大约是\(Int(高度值))英尺”) //版画:500米大约是1640英尺 然而,即使UnitLength和UnitSpeed都是Unit的子类,使用这些类型的测量值也不能以多态

Swift实现了
测量
类型,可用于将速度、高度等值保持在其所需的度量中

例如:

//在这里显式键入,这样问题就清楚了
var速度:测量值=测量值(值:10,单位:UnitSpeed.metersPerSecond)
变压高度:测量值=测量值(值:500,单位:单位长度。米)
高度.换算(单位长度.英尺)
打印(“500米大约是\(Int(高度值))英尺”)
//版画:500米大约是1640英尺
然而,即使
UnitLength
UnitSpeed
都是
Unit
的子类,使用这些类型的测量值也不能以多态方式传递到swift中的函数中

例如,如果传入类型为
Measurement
Measurement
的对象,则以下函数不起作用

func formatMeasurementAsString(度量:度量)->String{
返回“\(Int(measurement.value))\(measurement.unit.symbol)”
}
将上面定义的
速度
高度
传入此函数会产生以下错误:
无法将“测量”类型的值转换为预期的参数类型“测量”

编辑:


因此,在本例中,您可以显式地键入
速度
高度
,作为类型
测量
。但是,如果您这样做,它们将丢失非常有用的
.convert(to:)
函数,除非您在转换之前将它们重新键入
Measurement
,这不是很有帮助。

您可以将该函数设置为通用函数

func formatMeasurementAsString<T: Unit>(measurement: Measurement<T>) -> String {
    return "\(Int(measurement.value)) \(measurement.unit.symbol)"
}
180米
60公里/小时


这并不能解决您的问题,但正如您所知,像
formatMeasurementAsString
这样的函数会破坏99%的度量优势,即使用
MeasurementFormatter
谢谢@Alexander,我将对此进行调查!正如您所知道的,在无意中将有关格式化的假设编码到代码中时,请务必小心。在本例中,您编码的假设是,单元应以阿拉伯数字打印,每3位数字用逗号分组,后跟一个空格,后跟单元的英文名称。这在世界大多数国家是错误的。MeasurementFormatter为您实现了所有细微而复杂的本地化逻辑。
let length = Measurement(value: 180.0, unit: UnitLength.meters)
let speed = Measurement(value: 60, unit: UnitSpeed.kilometersPerHour)

print(formatMeasurementAsString(measurement: length))
print(formatMeasurementAsString(measurement: speed))