What is the best way to bind Core Data entities to enum values so that I am able to assign a type property to the entity? In other words, I have an entity called Item
with an itemType
property that I want to be bound to an enum, what is the best way of going about this.
views:
684answers:
2
+13
A:
You'd have to create custom accessors if you want to restrict the values to an enum. So, first you'd declare an enum, like so:
typedef enum {
kPaymentFrequencyOneOff = 0,
kPaymentFrequencyYearly = 1,
kPaymentFrequencyMonthly = 2,
kPaymentFrequencyWeekly = 3
} PaymentFrequency;
Then, declare getters and setters for your property. It's a bad idea to override the existing ones, since the standard accessors expect an NSNumber object rather than a scalar type, and you'll run into trouble if anything in the bindings or KVO systems try and access your value.
-(PaymentFrequency)itemTypeRaw {
return (PaymentFrequency)[[self itemType] intValue];
}
-(void)setItemTypeRaw:(PaymentFrequency)type {
[self setItemType:[NSNumber numberWithInt:type]];
}
Finally, you should implement +keyPathsForValuesAffecting<Key>
so you get KVO notifications for itemTypeRaw when itemType changes.
+(NSSet *)keyPathsForValuesAffectingItemTypeRaw {
return [NSSet setWithObject:@"itemType"];
}
iKenndac
2009-10-26 11:45:18
Thank you very much. Very clear answer.
Michael Gaylord
2009-10-26 11:51:35
+1
A:
An alternative approach I'm considering is not to declare an enum at all, but to instead declare the values as category methods on NSNumber.
Mike Abdullah
2009-11-16 16:58:48