iOS中的键值类型强制

时间:2012-04-11 15:29:53

标签: core-data ios5 key-value-coding

我正在使用Core Data编写应用程序,这在很大程度上取决于从字符串值设置属性。但是,我遇到了一个问题,因为Core Data在创建包装器方法时使用NSNumber来表示所有数字字段。因此,如果我使用键/值编码setValue传递一个String:forKey:它给我一个类型错误:

例如,我有一个对象类型“Building”。在datamodel中,我有一个名为“fbFloors”的属性设置为整数32。

然后,在我的代码中,我执行以下操作:

构建* b = [NSEntityDescription insertNewObjectForEntityForName:@“Building”inManagedObjectContext:ctx]; [b setValue:@“2”forKey:@“fbFloors”];

这引发了以下异常:

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'属性的值不可接受的类型:property =“fbFloors”;所需类型= NSNumber;给定type = __NSCFConstantString;值= 2。'

我希望将字符串值强制转换为数字,但它不想这样做。我尝试实现coerceValueForFbFloors:但它看起来只适用于Mac OS X,而不是iOS。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果你这样做了怎么办......

- (NSNumber*)fbFloorsValue:(NSString*)valueString
{
    return [NSNumber numberWithInteger: [valueString integerValue]];
}

您有每个非字符串属性的方法。然后,当您以通用方式设置这些值时......

假设你的密钥(“fbFloors”)在一个被调用的变量中,你的值(“2”)在一个名为...的变量中。

id valueObject;
SEL selector = NSSelectorFromString([NSString stringWithFormat:@"%@Value:", key]);
if (selector && [self respondsToSelector:selector]) {
    valueObject = [self performSelector:selector withObject:value];
} else {
    valueObject = value;
}
Building * b = [NSEntityDescription insertNewObjectForEntityForName:@"Building" inManagedObjectContext:ctx]; [b setValue:valueObject forKey:@key];

答案 1 :(得分:0)

您必须将NSNumber的实际实例传递给setValue。类似的东西:

[b setValue [NSNumber numberWithInt:2] forKey:@“fbFloors”];

如果您的数据显示为字符串,则可以使用NSNumberFormatter将其首先转换为NSNumber。