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