iOS中的键值类型强制

Posted

技术标签:

【中文标题】iOS中的键值类型强制【英文标题】:Key-Value Type Coercion in iOS 【发布时间】:2012-04-11 15:29:52 【问题描述】:

我正在使用 Core Data 编写一个应用程序,该应用程序严重依赖于从字符串值中设置属性。但是,我遇到了一个问题,因为 Core Data 在创建包装器方法时使用 NSNumber 来表示所有数字字段。因此,如果我使用键/值编码 setValue:forKey: 传入一个字符串,它会给我一个类型错误:

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

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

Building * b = [NSEntityDescription insertNewObjectForEntityForName:@"Building" inManagedObjectContext:ctx]; [b setValue:@"2" forKey:@"fbFloors"];

这会引发以下异常:

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

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

有什么想法吗?

【问题讨论】:

【参考方案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];

【讨论】:

【参考方案2】:

您必须将 NSNumber 的实际实例传递给 setValue。比如:

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

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

【讨论】:

我希望避免这种情况的原因是因为我希望能够避免直接对其进行编码。有许多具有各种类型的字段,但它们都是通过文本提要输入的,所以我希望 KVC 能够强制类型,而无需我手动编写每个字段发生的情况。我曾考虑添加一个名为“fbFloorsString”之类的字段来为我进行转换,但我希望有一种更自动的方式。

以上是关于iOS中的键值类型强制的主要内容,如果未能解决你的问题,请参考以下文章

map 中的键值都可以是啥类型的啊

Redis学习笔记09Redis数据类型之 哈希表类型

我可以在 TypeScript 中创建一个对每个键值对都是类型安全的键值字典吗?

Python面试必考重点之列表,元组和字典第十三关——有哪些数据类型不能作为字典键值的类型/为什么列表和字典类型的值不能作为字典的键值

[js高手之路] es6系列教程 - Map详解以及常用api

与JAVA类型相比较,MapReduce中定义的数据类型都有哪些特点?