1

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

这是描述问题的场景:

如果我有一种方法可以检查 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];

原始类型将设置为“i”,isBool 将设置为 NO

谁能向我解释这个原因或我如何让 myBoolValue 属性尊重它设置的原始类型?

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

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

4

2 回答 2

0

Core Data 将 BOOL 存储为 NSNFCNumber。要将其视为 BOOL,您可以使用此转换 BOOL myBool = [[NSString stringWithFormat@"%@", (NSInteger)[myManagedObject valueForKey:@"myAttribute"]]intValue] == 1;

在 Apple 论坛上找到了解决方案

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

编辑

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

于 2012-04-15T18:32:44.480 回答
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;
}
于 2012-04-16T02:10:49.127 回答