Swift 中的单位和测量值
Units and Measurements in Swift
我正在尝试制作一个测量输入键盘 class,它有一个值文本字段和一个单位选择器。
由于其通用行为,我在使用测量类型时遇到了问题。
我希望我的 class 到 return 一个基于初始值的新 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)
无需创建通用 class。只需创建一个单位或维度 属性。在您的方法中 getNewType return 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"
我正在尝试制作一个测量输入键盘 class,它有一个值文本字段和一个单位选择器。
由于其通用行为,我在使用测量类型时遇到了问题。
我希望我的 class 到 return 一个基于初始值的新 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)
无需创建通用 class。只需创建一个单位或维度 属性。在您的方法中 getNewType return 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"