2012-04-05 67 views
5

我的一個模型對象具有枚舉屬性。爲了將它存儲在CoreData中,我使用了一個NSNumber對象。在CoreData中存儲枚舉屬性並使其方便

儘管如此,我想以一種方便的方式作爲枚舉類型來訪問它。達到這個目標的最佳做法是什麼?

到目前爲止,我已經走了下面的代碼。

在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時使用的正確類型? (NSNumber不提供-(enum)enumValue;方法)
  • 您是否將驗證方面留給運行時CoreData模型驗證?
  • [新]我怎樣才能讓其他開發者明白,方便的屬性應該使用,而不是NSNumber屬性?

回答

0

iOS 5中的CoreData支持本地整數類型,所以如果需要的話,您可以使用它來代替NSNumber。

編輯

FWIW,編譯器就枚舉是必要的小已持有的可能值。在分配到NSNumber時,最好是將枚舉 - (int)myEnumValue強制轉換,因爲它假定類型是您告訴它的確切大小。

+0

很酷,我不知道這一點。不幸的是,我正在使用的應用程序必須支持iOS 4,至少在幾個月後。 – 2012-05-18 08:21:04