说我有以下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>
答案 0 :(得分:2)
以下代码应自动处理转换,只要object
参数是实现integerValue
的类的成员。
请注意,NSNumber
和NSString
都会实施此方法。
- (void)setValue:(id)object forKey:(NSString *)key
{
if ([key isEqual:@"someNumber"])
{
someNumber = [object integerValue];
}
//...
}
编辑:(旁注):
您可以通过使用objective-c属性来避免自己编写方法。 setValue:forKey:
的默认实施将为您完成工作,只要您为someNumber
和someString
创建属性。
答案 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不支持绑定。绑定将允许您添加一个值转换器,可以自动处理从字符串到数字的转换。也许在下一个版本中!