2008-11-18 44 views
3

说我有以下的Objective-C类:我如何一般使用KVC更新字段?

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

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

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

or 

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

如果object是一个字符串,我更新someNumber变量,看来我需要知道使用NSNumberFormatter获得一个NSNumber然后可可自动转换到内部setValue:forKey:一个int。

有没有什么办法可以避免这个自定义代码,并让Cocoa从字符串推断转换为int,还是我需要每次都捕获这种情况并自己处理它?

回答

1

您应该使用数字格式化程序自己完成转换,它比框架认为合适的任何东西都可以提供更好的控制。使用对象的单个实例更新ivars的值也可能不是一个好主意。更合适的是,你可以根据对象的类来执行你的更新(假设你没有通过存储在id中,那么通过object_getClassName查询对象的类。)更多的信息可以在Objective-C 2.0中找到但是一般来说,你可能会在代码中发现错误,因为这样做

2

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

注意两个NSNumberNSString实现此方法。

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

编辑:(边注): 可避免使用Objective-C的属性自己写的方法。只要您为someNumbersomeString创建属性,setValue:forKey:的默认实现将为您完成工作。

1

我对这个有着敏锐的洞察力。我认为setValue:forKey:等同于直接调用setter。如果你有一个方法:

- (void)setSomeValue:(NSInteger)aValue 

你不希望能够通过一个NSString,并希望该方法可以计算出来。

换句话说,一个键值允许你访问一个属性,并且该属性有一个类型。在使用KVC时,数字只是包装在NSNumber对象中,因此只有一个setValue:forKey:方法。因此,我说调用代码的责任始终是将字符串打包到NSNumber对象中。

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

相关问题