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"