这并不难,但比你想要的要难。
首先,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”,即NSNumber 或Int16 或其他。然后property 是好的。这通常是一个有点烦人的命名约定,因为它会使您的代码完成变得混乱。您想在 Core Data 中将其称为 _property 或 __property,但这不合法。所以有些人所做的就是称它为zProperty 或zzProperty,这样所有的支持属性都会排序到最后。
Xcode 8 可能还有一些其他强大的工具可以更好地帮助解决这个问题。我不知道,但我才刚刚开始探索 Xcode 8 中的 Core Data。