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”,即NSNumber
或Int16
或其他。然后property
是好的。这通常是一个有点烦人的命名约定,因为它会使您的代码完成变得混乱。您想在 Core Data 中将其称为 _property
或 __property
,但这不合法。所以有些人所做的就是称它为zProperty
或zzProperty
,这样所有的支持属性都会排序到最后。
Xcode 8 可能还有一些其他强大的工具可以更好地帮助解决这个问题。我不知道,但我才刚刚开始探索 Xcode 8 中的 Core Data。
【讨论】:
以上是关于Swift/IOS/CoreData:如何在自动生成的 CoreData 类中将 var 定义为枚举类型?的主要内容,如果未能解决你的问题,请参考以下文章
在c语言中 分别从变量的作用域和生存期来分析变量各都有哪些种类