键值编码及其脚本编写功能

时间:2008-12-19 19:33:03

标签: objective-c cocoa cocoa-touch key-value-observing

我有一个直接实例变量的对象。有些是NSString,有些是无符号整数等等。我的印象是Key-Value编码是可编写脚本的,因为我可以编写如下代码:

   id key, value;
   key      = [[attributes objectAtIndex:j] name];
   value    = [[attributes objectAtIndex:j] stringValue];
   [obj setValue:value forKey:key];

我在这里使用stringValue和名字的原因是我正在使用TouchXML并从XML Feed构建对象。

如果我尝试将任何内容分配给整数,则上面的代码会崩溃。如果我将unsigned int更改为NSString的实例,则没有任何运行时崩溃。根据我的理解,Key-Value编码非常智能,可以检测到这些问题。

我可能的解决方案是什么?我怎样才能尽可能地抽象出来,这样我就可以在许多不同的类上运行相同的方法,这些类都有自己的实例变量?

最优雅的方法是真正覆盖我的setter并使用NSNumber将字符串转换为int类型,我认为它已经被KVC处理了?

1 个答案:

答案 0 :(得分:3)

KVC在内部不进行任何类型强制/转换,因此传递给setValue:forKey:的对象类型必须与它将存储的实例变量的类型相匹配。本机类型如{{1 },int等被打包到long个对象中,诸如结构之类的东西被打包到NSNumber个对象中。要设置声明为本机类型的值,您应该为value参数传递适当的包装器对象。

我还建议在调用setter的代码中进行任何必需的翻译,而不是在setter本身。这更像是一个意见问题,所以我想如果你真的想,你可以在setter中翻译一些内容。我的代码版本如下所示:

NSValue