如何在核心数据中保存和检索通用测量?
我要做的是保存Measurement<UnitMass>
或Measurement<UnitVolume>
。
如下图所示,CoreData设置为接受Generic Measurement<Unit>
但是,当我设置度量值时,我收到错误。说我不允许这样做。我认为仿制药的目的是支持这样的用途。
我缺少什么?
答案 0 :(得分:3)
关于不匹配类型的错误并不是这里的重要部分。真正的问题是,可转换属性仅适用于符合NSCoding
或您已编写自定义值转换器的类。由于Measurement
不是一个类,并且不符合NSCoding
,因此您无法将其与可转换属性一起使用。
您的选择
Measurement
,保存其值,并转换为Measurement
。ValueTransformer
自定义子类,它将在Measurement
和Data
之间进行转换。我选择#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)")
}
属性的配置方式:
答案 1 :(得分:0)
在Swift中,Measurement确实采用了代码协议,因此可以通过可转换属性保存在Core Data中。
你得到的错误实际上非常清楚。您无法将特定的度量类型network = MockNetwork(
listOf("net.corda.finance.contracts.asset", "net.corda.finance.schemas")
)
保存到Core Data中的泛型类型Measurement<UnitMass>
。您也无法在主代码中执行此操作。修复很简单,因为每个属性都将该属性的特定类型指定为自定义类。