Swift / IOS / CoreData:如何在自动生成的CoreData类中将var定义为枚举类型?

时间:2016-08-21 14:07:55

标签: swift core-data

Swift / IOS新手在这里......

我有一个具有Int16属性的CoreData实体。我宁愿使用枚举来表示这个属性,但我使用的是自动生成的实体类(继承自NSManagedObject的那些),我不能直接更改属性的类型,因为它会被删除文件重新生成。

这有一个优雅的解决方案吗?

编辑:刚才意识到我甚至无法使用脏解决方案,因为我的枚举无法转换为Objective-C基元类型,因此无法在从NSManagedObject继承的对象中使用。

1 个答案:

答案 0 :(得分:0)

这并不难,但它比你想要的更难。

首先,IMO,放弃"如果文件被重新生成"部分。虽然我尝试尽可能少地搞乱自动生成的文件,但根据我的经验(至少在Xcode 8之前,一切都在变化,我还没有真正探索过Core Data),让Xcode重新生成这些文件不是值得头痛的。生成一次,然后根据需要进行调整。这是有争议的,并非绝对必要,但根据我的经验,效果最好。

所以说,在MyObject+CoreDataProperties中,只要注释掉这个定义。例如,来自我的一个文件:

//    @NSManaged public var id: NSNumber? // programmatic

是的,这很难看,但它给我带来了很多麻烦(我将在下面解释我的旧方法,但这并不能解决这个问题)。即使您执行重新生成文件,错误也会非常明显,因此它们并不太难修复。

完成后,只需重新实现您的类型:

var myProperty: MyProperty? {
    get { return MyEnum(rawValue: primitiveValueForKey("myProperty") }
    set { setPrimitiveValue(newValue.rawValue, forKey: "myProperty") }
}

当然,如果失败或返回默认值,您可以通过崩溃使其成为非可选项,并且您可以在此处使用rawValue之外的其他内容。无论什么是合适的。

请注意myProperty不是@objc(并且不能是动态的;因此不能是KVO)。因此,如果您愿意,可以在此使用valueForKey而不是primitiveValueForKey

但Rob,我真的,真的想让我的文件重新生成(而且Xcode 8无论如何都会推动我们这样做,所以不要再告诉我们做一些会破坏某些事情的事情)。很公平。

您可以通过将支持属性命名为与公共属性不同的方法来实现。所以在CoreData中,属性被称为" propertyValue"这是一个NSNumberInt16或其他什么。然后property是好的。这通常是一种有点烦人的命名约定,因为它会使代码完成变得混乱。您要在核心数据中使用_property__property,但这不合法。所以有些人所做的就是将其命名为zPropertyzzProperty,以便所有支持属性排序到最后。

Xcode 8还有其他强大的工具来帮助改善这一点。我不知道一个,但我只是开始在Xcode 8中探索核心数据。