首页 > 解决方案 > 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)

标签: swiftgenericsmeasurement

解决方案


无需创建泛型类。只需创建一个单位或维度属性。在您的方法中 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"

推荐阅读