我想在CoreData
中存储托管对象的枚举状态enum ObjStatus: Int16 {
case State1 = 0
case State2 = 1
case State3 = 3
}
class StateFullManagedObject: NSManagedObject {
@NSManaged var state: Int16
}
最后一步是将StateFullManagedObject的状态变量转换为ObjStatus以进行直接比较,这对我来说并不适用。例如,我不能在Int16和Int16枚举之间使用==运算符。我得到的编译时错误是
Int16无法转换为' MirrorDisposition'
。见下面的条件:
var obj: StateFullManagedObject = // get the object
if (obj.state == ObjStatus.State1) { // Int16 is not convertible to 'MirrorDisposition'
}
如何在Int16和枚举之间进行比较/分配?
答案 0 :(得分:65)
You can declare your enum as @objc. Then it all automagically works. Here's a snippet from a project I'm working on.
// Defined with @objc to allow it to be used with @NSManaged.
@objc enum AgeType: Int32
{
case Age = 0
case LifeExpectancy = 1
}
/// The age type, either Age or LifeExpectancy.
@NSManaged var ageType: AgeType
In the Core Data model, ageType is set to type Integer 32.
答案 1 :(得分:48)
您可以使用Int16
.rawValue
属性提取原始ObjStatus
值。
// compare
obj.state == ObjStatus.State1.rawValue
// store
obj.state = ObjStatus.State1.rawValue
但您可能希望为其实现stateEnum
访问者:
class StateFullManagedObject: NSManagedObject {
@NSManaged var state: Int16
var stateEnum:ObjStatus { // ↓ If self.state is invalid.
get { return ObjStatus(rawValue: self.state) ?? .State1 }
set { self.state = newValue.rawValue }
}
}
// compare
obj.stateEnum == .State1
// store
obj.stateEnum = .State1
// switch
switch obj.stateEnum {
case .State1:
//...
case .State2:
//...
case .State3:
//...
}
答案 2 :(得分:1)
Xcode 12.5 Swift 5
我使用 Enums
数据库将多个 CoreData
的值存储在 CloudKit
中。
要使其正常工作,需要执行一些精确的步骤。我在这里列出了我学到的东西,效果很好。
第 1 步:定义您的枚举:
将其标记为 @objc
、public
和 Int16
@objc
public enum SomeState: Int16 {
case stateA
case stateB
case stateC
}
第 2 步:在您的 xcdatamodeld 中创建一个属性,用于存储枚举值
类型应该是Integer 16
第 3 步:在 Data Model Inspector 中取消选中 Optional,并将默认值设置为 0
这等同于 Enum
的第一个索引。
第 4 步:在父实体的数据模型检查器中,将 Class Codegen 更改为 Manual/None
步骤 5:创建 NSManaged 子类
单击实体名称,然后从菜单栏中选择编辑器 > 创建 NSManagedObject 子类。确保将目标设置为您的主项目。这将在项目导航器中创建两个新文件。
MyObject+CoreDataClass.swift
MyObject+CoreDataProperties.swift
第 6 步:在 MyObject+CoreDataProperties.swift 文件中,将属性类型从 Int16 更改为 Enum 类型
extension MyObject {
@NSManaged public var state: SomeState
}
用法:
设置/更新值:
myObject.state = .stateA
NSPredicate 用于搜索枚举值:
NSPredicate(format: "state = %i", SomeState.stateA.rawValue)