我遇到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时,我需要采用不同的代码路径,如果它是一个布尔值而不是它想要是一个整数。
答案 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;
}