Best way to implement Enums with Core Data

前端 未结 9 1600
天命终不由人
天命终不由人 2020-11-28 17:55

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<

9条回答
  •  借酒劲吻你
    2020-11-28 18:18

    The code pasted below works for me, and I've added it as full working example. I'd like to hear opinions on this approach, as I plan to used it extensively throughout my apps.

    • I've left the @dynamic in place, as it is then satisfied by the getter/setter named in the property.

    • As per the answer by iKenndac, I have not overridden the default getter/setter names.

    • I've included some range checking via a NSAssert on the typedef valid values.

    • I've also added a method to obtain a string value for the given typedef.

    • I prefix constants with "c" rather than "k". I know the reasoning behind "k" (math origins, historical), but it feels like I am reading ESL code with it, so I use "c". Just a personal thing.

    There is a similar question here: typedef as a Core data type

    I'd appreciate any input on this approach.

    Word.h
    
    #import 
    #import 
    
    typedef enum {
        cPresent            = 0,    
        cFuturProche        = 1,    
        cPasseCompose       = 2,    
        cImparfait          = 3,    
        cFuturSimple        = 4,    
        cImperatif          = 5     
    } TenseTypeEnum;
    
    @class Word;
    @interface Word : NSManagedObject
    
    @property (nonatomic, retain) NSString * word;
    @property (nonatomic, getter = tenseRaw, setter = setTenseRaw:) TenseTypeEnum tense;
    
    // custom getter & setter methods
    -(void)setTenseRaw:(TenseTypeEnum)newValue;
    -(TenseTypeEnum)tenseRaw;
    - (NSString *)textForTenseType:(TenseTypeEnum)tenseType;
    
    @end
    
    
    Word.m
    
    
    #import "Word.h"
    
    @implementation Word
    
    @dynamic word;
    @dynamic tense;
    
    // custom getter & setter methods
    -(void)setTenseRaw:(TenseTypeEnum)newValue
    {
        NSNumber *numberValue = [NSNumber numberWithInt:newValue];
        [self willChangeValueForKey:@"tense"];
        [self setPrimitiveValue:numberValue forKey:@"tense"];
        [self didChangeValueForKey:@"tense"];
    }
    
    
    -(TenseTypeEnum)tenseRaw
    {
        [self willAccessValueForKey:@"tense"];
        NSNumber *numberValue = [self primitiveValueForKey:@"tense"];
        [self didAccessValueForKey:@"tense"];
        int intValue = [numberValue intValue];
    
        NSAssert(intValue >= 0 && intValue <= 5, @"unsupported tense type");
        return (TenseTypeEnum) intValue;
    }
    
    
    - (NSString *)textForTenseType:(TenseTypeEnum)tenseType
    {
        NSString *tenseText = [[NSString alloc] init];
    
        switch(tenseType){
            case cPresent:
                tenseText = @"présent";
                break;
            case cFuturProche:
                tenseText = @"futur proche";
                break;
            case cPasseCompose:
                tenseText = @"passé composé";
                break;
            case cImparfait:
                tenseText = @"imparfait";
                break;
            case cFuturSimple:
                tenseText = @"futur simple";
                break;
            case cImperatif:
                tenseText = @"impératif";
                break;
        }
        return tenseText;
    }
    
    
    @end
    

提交回复
热议问题