Хранение измерений в основных данных

Я сохраняю измерения тела в приложении с помощью Core Data. Эти измерения могут относиться к типу UnitMass (т.е. вес) или UnitLength (т.е. рост). В приложении эти измерения передаются с использованием экземпляров Measurement, что позволяет легко конвертировать метрические единицы в британские. В Core Data значения измерений сохраняются как двойные с использованием устройства baseUnit().

Однако я не знаю, как хранить Ед. изм в базе данных. Я придумал это:

enum BodyMeasurementUnit: Int16 {
    case mass = 0
    case length

    static func unit(for value: Int16) -> BodyMeasurementUnit {
        switch value {
        case 0: return .mass
        default: return .length
        }
    }
}

что позволяет мне хранить применимую единицу по индексу. Но я бы предпочел функцию, которая напрямую возвращает UnitMass или UnitLength. Есть ли у кого-нибудь из вас идеи получше? Кроме того, хотя использование enum таким образом позволяет мне легко добавлять дополнительные типы модулей в случае необходимости, я чувствую, что каким-то образом дублирую классы Apple Unit* вместо того, чтобы просто дополнять их в соответствии с моими потребностями. Кто угодно? Спасибо за помощь!

Зачем вообще нужно хранить агрегат? Разве это не ясно из контекста? Если вы сохраняете высоту / ширину / ... тогда это длина. Если вы храните гирю, то это масса.

Martin R 13.09.2018 21:04

Другой способ сделать это - создать таблицу CoreData с именем BodyMeasurementUnit, в которой есть столбец name и все, что вам нужно. Добавьте строки для каждого типа измерения, тогда BodyMeasurement может иметь отношение к соответствующей строке BodyMeasurementUnit.

Alex 13.09.2018 21:06

@Martin R: Это таблица, в которой просто хранятся значения. Если я, например, сохраню 25, то как я смогу определить, это длина или масса? Это поле единицы измерения, которое добавляет необходимый контекст.

Tom E 13.09.2018 21:11

Если вы храните 25 метров или 100 кг, как вы узнаете, что измеряется какие?

Martin R 13.09.2018 21:23

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

Tom E 13.09.2018 21:27
0
5
198
1

Ответы 1

Вы можете сохранить единицу измерения и значение в двух отдельных переменных, а затем написать вычисляемое свойство, возвращающее:

enum Return {
    case weight(Int)
    case length(Int)
}

, что дает гораздо более простой API.

Статический инициализатор не требуется, поскольку rawValue-enum генерирует свой собственный инициализатор init(rawValue: RawValueType) (RawValueType=Int here).

было бы полезно увидеть здесь более подробную информацию

Aaronium112 09.08.2020 00:04

Другие вопросы по теме