如何在核心数据中保存通用度量单位?

Aar*_*112 2 generics core-data swift

如何在核心数据中保存和检索通用度量?

我想做的是保存a Measurement<UnitMass>或a Measurement<UnitVolume>

如下图所示,CoreData设置为接受Generic Measurement<Unit>

核心数据的通用测量

但是,当我去设置度量值时会出现错误。说我不允许这样做。我认为泛型的目的是支持这样的用途。

我想念什么?

在此处输入图片说明

Tom*_*ton 5

有关类型不匹配的错误在这里不是重要的部分。真正的问题是,可变形属性仅适用于符合NSCoding或已为其编写自定义值转换器的类。由于Measurement它不是类,也不符合NSCoding,因此不能将其与可转换属性一起使用。

您的选择是

  1. 保存/读取属性值时Measurement,请不要保存,保存其值,也不要将其转换为Measurement
  2. 编写自己的自定义子类,ValueTransformer该子类将在Measurement和之间转换Data

我会选择#1。您可以在托管对象子类上添加便捷方法来处理转换。

更新:根据您的Measurement<UnitMass>情况,我会做类似的事情:

  • 为属性指定一个Double名为的属性massValue
  • 给该属性一个massUnit以自定义类命名的可变形属性UnitMass(请参见下文)。
  • 使用以下方式保存值:

    let servingMeasure = Measurement<UnitMass>(value:500, unit:.grams)
    myObject.massValue = servingMeasure.value
    myObject.massUnit = servingMeasure.unit
    
    Run Code Online (Sandbox Code Playgroud)
  • 检索值类似于:

    if let unit = myObject.massUnit {
        let value = myObject.massValue
        let measurement = Measurement<UnitMass>(value:value, unit:unit)
        print("Measurement: \(measurement)")
    }
    
    Run Code Online (Sandbox Code Playgroud)

massUnit是配置属性的方式:

在此处输入图片说明