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

Posted

技术标签:

【中文标题】Swift/IOS/CoreData:如何在自动生成的 CoreData 类中将 var 定义为枚举类型?【英文标题】:Swift/IOS/CoreData: How would I define a var as an enum type in an auto-generated CoreData class? 【发布时间】:2016-08-21 14:07:54 【问题描述】:

这里是 Swift/ios 新手...

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

有没有优雅的解决方案?

编辑:刚刚意识到我什至不能使用肮脏的解决方案,因为我的枚举无法转换为 Objective-C 原始类型,因此不能用于从 NSManagedObject 继承的对象中。

【问题讨论】:

【参考方案1】:

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

首先,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 是好的。这通常是一个有点烦人的命名约定,因为它会使您的代码完成变得混乱。您想在 Core Data 中将其称为 _property__property,但这不合法。所以有些人所做的就是称它为zPropertyzzProperty,这样所有的支持属性都会排序到最后。

Xcode 8 可能还有一些其他强大的工具可以更好地帮助解决这个问题。我不知道,但我才刚刚开始探索 Xcode 8 中的 Core Data。

【讨论】:

以上是关于Swift/IOS/CoreData:如何在自动生成的 CoreData 类中将 var 定义为枚举类型?的主要内容,如果未能解决你的问题,请参考以下文章

8——对象的作用域,生存期,……

变量的生存期和存储分配

MIT自动驾驶的道德研究:自动驾驶生与死做出选择

在c语言中 分别从变量的作用域和生存期来分析变量各都有哪些种类

一位3年软件自动化测试的焦虑:月薪不到3万,担心被应届生取代

C语言变量的作用域和生存期问题