我如何通常使用KVC更新字段?

时间:2008-11-18 17:02:51

标签: iphone objective-c cocoa-touch

说我有以下Objective-C类:

@interface Foo {
     int someNumber;
     NSString *someString;
}

由于我不会进入这里的原因,我想使用KVC以通用的方式更新这些变量的值:

[f setValue:object forKey:@"someNumber"];

or

[f setValue:object forKey:@"someString"];`

如果object是一个字符串并且我正在更新someNumber变量,似乎我需要知道使用NSNumberFormatter获取NSNumber然后Cocoa自动将其转换为int内部setValue:forKey:

有没有办法避免这个自定义代码并让Cocoa推断从字符串转换为int,或者我是否需要每次捕获这种情况并自己处理它?<​​/ p>

3 个答案:

答案 0 :(得分:2)

以下代码应自动处理转换,只要object参数是实现integerValue的类的成员。

请注意,NSNumberNSString都会实施此方法。

- (void)setValue:(id)object forKey:(NSString *)key
{
    if ([key isEqual:@"someNumber"])
    {
        someNumber = [object integerValue];
    }
    //...
}

编辑:(旁注): 您可以通过使用objective-c属性来避免自己编写方法。 setValue:forKey:的默认实施将为您完成工作,只要您为someNumbersomeString创建属性。

答案 1 :(得分:1)

您应该使用数字格式化程序自行进行转换,它比框架可能认为合适的任何内容都更精细。使用对象的单个实例更新ivars的值也可能不是一个好主意。更合适的是,您可以根据对象的类执行更新(假设您没有通过id通过查询运行时关于对象的类来存储object_getClassName。更多信息可以在Objective-C 2.0运行时参考中找到。但是一般情况下,您可能会因为这样做而在代码中发现错误。

答案 2 :(得分:1)

我对这一点非常明智。我想到setValue:forKey:等同于直接调用setter。如果你有方法:

- (void)setSomeValue:(NSInteger)aValue

您不希望传递NSString并希望该方法可以解决它。

换句话说,键值使您可以访问属性,并且该属性具有类型。使用KVC时,数字只会被包装在NSNumber对象中,因此只有一个setValue:forKey:方法。因此,我说调用代码总是负责将字符串打包在NSNumber对象中。

有些时候我感叹Cocoa Touch不支持绑定。绑定将允许您添加一个值转换器,可以自动处理从字符串到数字的转换。也许在下一个版本中!