Единицы и измерения в Swift - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь создать класс клавиатуры ввода измерений, в котором есть текстовое поле для значения и средство выбора для единицы.

У меня проблемы с использованием типа измерения из-за его общего c поведение.

Я бы хотел, чтобы мой класс возвращал новый экземпляр измерения на основе начального значения, но позволял пользователю изменять единицу измерения без обязательного ее преобразования. Я получаю сообщение об ошибке «Невозможно преобразовать значение типа« Единица »в ожидаемый тип аргумента« Т »» в строке, где я инициализирую значение «Меер» значением и единицей другого типа.

Также есть есть ли способ перебрать встроенные подъединицы типа измерения? т.е. получить, например, все подмножества UnitPressure.

Если бы кто-нибудь мог просто указать мне на ответ о подобном c поведении, это было бы очень признательно.

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)

1 Ответ

0 голосов
/ 02 августа 2020

Нет необходимости создавать общий класс c. Просто создайте свойство единицы или измерения. И в вашем методе 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"
...