gpt4 book ai didi

swift/IOS/核心数据 : How would I define a var as an enum type in an auto-generated CoreData class?

转载 作者:行者123 更新时间:2023-11-28 08:29:46 24 4
gpt4 key购买 nike

这里是 Swift/IOS 新手...

我有一个具有 Int16 属性的 CoreData 实体。我更愿意使用枚举来表示此属性,但我使用的是自动生成的实体类(那些继承自 NSManagedObject 的实体类),而且我不能直接更改属性的类型,因为如果文件重新生成。

有没有优雅的解决方案?

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

最佳答案

这并不难,但比您想象的要难。

首先,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 无论如何都会插入我们这样做,所以不要再告诉我们做有一天会崩溃的事情)。很公平。

您可以通过将支持属性命名为与公共(public)属性不同的名称来实现。所以在 CoreData 中,该属性称为“propertyValue”,它是一个 NSNumberInt16 或其他名称。然后 property 是好的。这通常是一个有点烦人的命名约定,因为它会使您的代码完成变得困惑。你想称它为 Core Data 中的 _property__property,但这是不合法的。所以有些人将其称为 zPropertyzzProperty,这样所有支持属性都排序到最后。

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

关于 swift/IOS/核心数据 : How would I define a var as an enum type in an auto-generated CoreData class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39065107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com