5

モデル オブジェクトの 1 つに enum プロパティがあります。CoreData に格納するために、NSNumber オブジェクトを使用しました。

それにもかかわらず、便利な方法で列挙型としてアクセスしたいと思います。それを達成するためのベストプラクティスは何ですか?

これまでのところ、次のコードを使用しました。

MyObject.h で

typedef enum _ABType {
    ABTypeUnknown,
    ABTypeValue1,
    ...
    ABTypeValueN
} ABType;

@interface MyObject : NSManagedObject

@property (nonatomic, retain) NSNumber * myPersistentEnum; // Defined in my Core Data model

@property (nonatomic) ABType myConvenientEnum;

MyObject.m で

@dynamic myPersistentEnum;

- (BOOL)isValidEnumValue {
    if (self.myPersistentEnum) {
        int intValue = [self.type intValue];
        if (intValue >= ABTypeValue1 && intValue <= ABTypeValueN) {
            return YES;
        }        
    }

    ELog(@"Undefined enumValue %@", self.myPersistentEnum);
    return NO;
}

- (ABType)myConvenientEnum {
    if ([self isValidEnumValue]) {
        return [self.type intValue];
    }

    return ABTypeUnknown;
}

- (void)setMyConvenientEnum:(ABType)enumValue {
    NSNumber *oldValue = [self.myPersistentEnum retain];
    self.myPersistentEnum = [NSNumber numberWithInt:enumValue];
    if ([self isValidEnumValue]) {
        [oldValue release];
    } else {
        self.myPersistentEnum = oldValue;
        [oldValue release];
    }
}

私の質問は次のとおりです。

  • 上記のコードに何か問題がありますか?
  • int列挙型を NSNumber に変換するときに使用する適切な型はありますか? -(enum)enumValue;(NSNumber はメソッドを提供しません)
  • 検証の側面はランタイム CoreData モデルの検証に任せますか?
  • [NEW] NSNumber プロパティではなく、便利なプロパティを使用する必要があることを他の開発者に明確にするにはどうすればよいですか?
4

1 に答える 1

0

iOS 5のCoreDataはネイティブ整数型をサポートしているため、必要に応じてNSNumberの代わりにそれを使用できます。

編集

FWIW、コンパイラーは、列挙型を、保持する可能性のある値に対して必要なだけ小さくすることができます。NSNumberに割り当てるときは、列挙型(int)myEnumValueをキャストするのが最適です。これは、型が指定した正確なサイズであると想定しているためです。

于 2012-05-18T02:20:46.680 に答える