【问题标题】:Key-Value Type Coercion in iOSiOS中的键值类型强制
【发布时间】: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 中。

有什么想法吗?

【问题讨论】:

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


    【解决方案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”之类的字段来为我进行转换,但我希望有一种更自动的方式。
      猜你喜欢
      • 2018-08-26
      • 2014-05-02
      • 2016-01-13
      • 2021-11-23
      • 1970-01-01
      • 2013-08-11
      • 2022-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多