核心数据:将不同类型保存为同一属性

时间:2016-01-07 18:46:42

标签: core-data swift2

我有一个核心数据实体,它有一个可以表示不同类型值的属性(int,double,date,string)。

如果我将所有这些值转换为字符串然后返回,是否会导致某些问题(例如精度损失)?

@nsmanaged var storedType : Int
@nsmanaged var storedValue : String
var value: Any? {
{
 set {
  switch newValue
  {
  case is Int:
    self.storedValue = String(newValue)
    self.storedType = 0

  ...

  case is string
    self.storedValue = newValue
    self.storedType = 5
  }
 }
 get {
  switch newValue
  {
  case is 0:
    return Int(self.storedValue)

  ...

  case is 5:
    return self.storedValue
  }
 }
}
}

1 个答案:

答案 0 :(得分:2)

虽然我首先想到这个架构很长很难,但我同意这个功能可能有一个案例,除了SO之外还应该问这个问题*。

一种选择是使用可转换的属性类型。这种类型允许coreData存储符合NSCoding的任何对象(NSArray,NSDictionary等)以及我相信的NSString和NSNumber。

因此,您可以将该对象检索为泛型类型(Objective-C中的id,不知道swift中的等效项),然后查询它的类型并将其转换为您需要的任何类型。

这种方法的缺点当然是你在查询商店时失去了很多coreData的能力,因为你存储为可转换属性的值对于谓词等或多或少都是不透明的。但是它适用于使用关键路径遍历核心数据结构。

*)我相信我读到VB中等效的变体数据类型是Joel Spolsky对该语言的贡献...