将枚举值设置为核心数据对象

时间:2016-02-15 15:42:59

标签: ios swift core-data enums

我有一个核心数据对象:

@objc enum ProductType:Int32 {
    case One
    case Two
}

class Product: NSManagedObject {

    @NSManaged var productType:ProductType
}

我在这里读到了这个:Swift: Storing states in CoreData with enums

然后我想创建对象:

product = NSEntityDescription.insertNewObjectForEntityForName("Product", inManagedObjectContext: appDelegate.managedObjectContext) as! Product

product.setValue(ProductType.One, forKey: "productType")

但是编译器说:

  

无法将类型''的值转换为预期的参数类型'AnyObject?'

我怀疑这是使用枚举工作的正确解决方案......

1 个答案:

答案 0 :(得分:3)

如果您想通过setValue(: forKey:)设置属性,则该值必须符合AnyObject;因此,您可以将枚举更改为NSNumber,例如。 NSNumber(int: ProductType.Two.rawValue)

如果您想直接通过enum ProductType设置属性,要实现自定义setter和getter可以拥有该功能。请参考以下Product课程作为参考:

class Product: NSManagedObject {
    @NSManaged var productType: NSNumber?

    // For Option 3 by adding a ProductType property
    var type: ProductType {
        get {
            return ProductType(rawValue: self.productType!.intValue)!
        }
        set {
            self.productType = NSNumber(int:newValue.rawValue)
        }
    }
}

let product = NSEntityDescription.insertNewObjectForEntityForName("Product", inManagedObjectContext: self.managedObjectContext) as! Product
// Option 1: Set productType via setValue(:forKey:)
product.setValue(NSNumber(int: ProductType.Two.rawValue), forKey: "productType")
// Option 2: Set productType directly
product.productType = NSNumber(int: ProductType.Two.rawValue)
// Option 3: set productType via an extra ProductType property
product.type = ProductType.Two