如何在核心数据中保存通用度量<unit>?

时间:2018-01-30 13:42:08

标签: swift generics core-data

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

我要做的是保存Measurement<UnitMass>Measurement<UnitVolume>

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

Generic Measurement in Core Data

但是,当我设置度量值时,我收到错误。说我不允许这样做。我认为仿制药的目的是支持这样的用途。

我缺少什么?

enter image description here

2 个答案:

答案 0 :(得分:3)

关于不匹配类型的错误并不是这里的重要部分。真正的问题是,可转换属性仅适用于符合NSCoding或您已编写自定义值转换器的类。由于Measurement不是一个类,并且不符合NSCoding,因此您无法将其与可转换属性一起使用。

您的选择

  1. 保存/读取属性值时,请不要保存Measurement,保存其值,并转换为Measurement
  2. 编写您自己的ValueTransformer自定义子类,它将在MeasurementData之间进行转换。
  3. 我选择#1。您可以在托管对象子类上添加便捷方法来处理转换。

    更新:使用Measurement<UnitMass>案例,我可以执行以下操作:

    • 为属性指定名为Double的{​​{1}}属性。
    • 为该属性指定一个名为massValue的可转换属性,其中包含自定义类massUnit(见下文)。
    • 使用以下内容保存值:

      UnitMass
    • 使用以下内容检索值:

      let servingMeasure = Measurement<UnitMass>(value:500, unit:.grams)
      myObject.massValue = servingMeasure.value
      myObject.massUnit = servingMeasure.unit
      

    这是if let unit = myObject.massUnit { let value = myObject.massValue let measurement = Measurement<UnitMass>(value:value, unit:unit) print("Measurement: \(measurement)") } 属性的配置方式:

    enter image description here

答案 1 :(得分:0)

在Swift中,Measurement确实采用了代码协议,因此可以通过可转换属性保存在Core Data中。

你得到的错误实际上非常清楚。您无法将特定的度量类型network = MockNetwork( listOf("net.corda.finance.contracts.asset", "net.corda.finance.schemas") ) 保存到Core Data中的泛型类型Measurement<UnitMass>。您也无法在主代码中执行此操作。修复很简单,因为每个属性都将该属性的特定类型指定为自定义类。