Swift:使用枚举在Core Data中存储状态

时间:2014-11-13 02:24:37

标签: core-data swift

我想在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和枚举之间进行比较/分配?

3 个答案:

答案 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 步:定义您的枚举:

将其标记为 @objcpublicInt16

@objc
public enum SomeState: Int16 {
    case stateA
    case stateB
    case stateC
}

第 2 步:在您的 xcdatamodeld 中创建一个属性,用于存储枚举值

类型应该是Integer 16

enter image description here

第 3 步:在 Data Model Inspector 中取消选中 Optional,并将默认值设置为 0

这等同于 Enum 的第一个索引。

enter image description here

第 4 步:在父实体的数据模型检查器中,将 Class Codegen 更改为 Manual/None

enter image description here

步骤 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)