swift - Swift 中的单位和度量
问题描述
我正在尝试创建一个测量输入键盘类,该类具有一个文本字段的值和一个单位的选择器。
由于其通用行为,我无法使用 Measurement 类型。
我希望我的类基于初始值返回一个新的测量实例,但允许用户更改单位而不必转换它。在我用一个值和一个不同类型的单位初始化 meas 的行上,我收到错误“无法将类型 'Unit' 的值转换为预期的参数类型 'T'”。
另外,有没有办法遍历维度类型的内置子单元?例如,获取 UnitPressure 的所有子单位。
如果有人能指点我一个关于类似通用行为的答案,那将不胜感激。
class MeasurementPicker<T : Dimension> {
init(initialUnit: Measurement<T>) {
self.initUnit = initialUnit
}
var initUnit: Measurement<T>
func getUnitList() -> [Unit]? {
switch initUnit.unit.self {
case is UnitPressure:
let retUnits: [Unit]? = [
UnitPressure.bars,
UnitPressure.gigapascals,
UnitPressure.hectopascals,
UnitPressure.inchesOfMercury,
UnitPressure.kilopascals,
UnitPressure.megapascals,
UnitPressure.millibars,
UnitPressure.millimetersOfMercury,
UnitPressure.newtonsPerMetersSquared,
UnitPressure.poundsForcePerSquareInch
]
return retUnits
default:
return nil
}
}
func getNewType(index: Int) -> Measurement<T> {
let myNewUnit : Unit = getUnitList()![index]
var meas = Measurement<T>.init(value: 6, unit: myNewUnit)
}
}
let x = Measurement(value: 5.5, unit: UnitPressure.kilopascals)
let y = MeasurementPicker<UnitPressure>(initialUnit: x)
let z = y.getNewType(index: 0)
print(z.unit.symbol)
解决方案
无需创建泛型类。只需创建一个单位或维度属性。在您的方法中 getNewType 返回Measurement<Unit>
或仅返回单位或尺寸。您也可以只使用下标从列表中获取维度:
class MeasurementPicker {
init(dimension: Dimension) { self.dimension = dimension }
var dimension: Dimension
var list: [Dimension] {
switch dimension.self {
case is UnitPressure:
return [UnitPressure.bars,
UnitPressure.gigapascals,
UnitPressure.hectopascals,
UnitPressure.inchesOfMercury,
UnitPressure.kilopascals,
UnitPressure.megapascals,
UnitPressure.millibars,
UnitPressure.millimetersOfMercury,
UnitPressure.newtonsPerMetersSquared,
UnitPressure.poundsForcePerSquareInch]
default: return []
}
}
}
用法:
let y = MeasurementPicker(dimension: UnitPressure.kilopascals)
let z = y.list[0]
print(z.symbol) // "bar\n"
推荐阅读
- coldfusion - Coldfusion mail() 对象集认证
- apache-spark - 使用 spark 中的 dataset api 提取对象中的嵌套对象
- javascript - 多个页面相同的 CSS/JS 文件但不同的 URL
- ssl - 将多个 SSL 证书路由到一个应用程序中
- c# - 尝试使用动态 LINQ 但不知道从哪里开始?
- wordpress - ACF 中继器字段和 Clearfix / 显示时的样式
- javascript - 无法删除 React Native FlatList 中的项目
- python - 如何使用boost(非sclar类型错误)调用从C++返回队列的python方法?
- websphere - IBM NodeRED App Deploy 错误 - Memory Limit Exceeded 错误状态:400,错误代码:100005
- javascript - 防止 Recharts 刻度线重叠