NSManagedObject NSNumber属性将布尔值转换为整数?

时间:2012-04-15 18:05:05

标签: ios core-data nsnumber

我遇到NSManagedObject子类的问题,其值设置为boolean值,但原始类型似乎总是一个整数。

以下是描述问题的方案:

如果我有一个方法来检查NSNumber的基本类型,如下所示:

- (BOOL) numberIsBool:(NSNumber*)numberToCheck {

   const char *primitiveType = [numberToCheck objCType];

   return (strcmp(primitiveType, @encode(BOOL)) == 0 );
 }

我执行以下代码:

NSNumber *num = [NSNumber numberWithBool:YES];

BOOL isBool = [self numberIsBool:num];

正如所料,primitiveType将为“c”,isBool将为YES。

但是,如果我采用NSManagedObject子类:

@interface MyClass : NSManagedObject

@property (nonatomic, retain) NSNumber *myBoolValue;
...
@end

其中myBoolValue设置为在模型中键入Boolean,并执行以下代码:

MyClass *myClass = ... (create from NSManagedObjectContext)

myClass.myBoolValue = [NSNumber numberWithBool:YES];

BOOL isBool = [self numberIsBool:num];

primitiveType将设置为“i”,isBool将为NO

有人可以向我解释这个的原因,或者我如何获得myBoolValue属性来尊重它所设置的原始类型?

编辑:所以我想要完成的事情没有混淆 - 我不是试图将NSNumber转换为布尔值。我已经知道如何使用 [myBoolValue boolValue]执行此操作。

编辑#2 - 更多说明:如果我询问NSManagedObject的属性。当属性是一个NSNumber并且它的值是1或0时,我需要采用不同的代码路径,如果它是一个布尔值而不是它想要是一个整数。

2 个答案:

答案 0 :(得分:0)

核心数据将BOOL存储为NSNFCNumbers。 要像BOOL一样对待它,你可以尝试这种转变  BOOL myBool = [[NSString stringWithFormat@"%@", (NSInteger)[myManagedObject valueForKey:@"myAttribute"]]intValue] == 1;

在Apple论坛上找到解决方案

https://discussions.apple.com/thread/2169600?start=0&tstart=0

修改

在你的numberIsBool中,你应该将你的primitiveType与 NSCFBoolean 进行比较,因为这是存储在核心数据中的BOOL类型

答案 1 :(得分:0)

感谢@Nikita发现的帖子,我意识到这是NSManagedObject的缺点,所以我想出了解决问题的方法:

- (BOOL) property:(NSString*)propertyName ofObjectIsBoolean:(NSObject*)object {
     BOOL isBoolean = NO;

     if ([object respondsToSelector:@selector(entity)]) {

         NSEntityDescription *description = [object entity];

         NSDictionary *attributes = [description attributesByName];

         NSAttributeDescription *attributeDescription = [attributes objectForKey:propertyName];

         NSAttributeType attributeType = [attributeDescription attributeType];

         isBoolean = (attributeType == NSBooleanAttributeType);
      else {

         const char *primitiveType = [numberToCheck objCType];

         isBoolean = (strcmp(primitiveType, @encode(BOOL)) == 0 );
      }

      return isBoolean;
}