Objective c 键值编码及其脚本功能

Objective c 键值编码及其脚本功能,objective-c,cocoa,cocoa-touch,key-value-observing,Objective C,Cocoa,Cocoa Touch,Key Value Observing,我有一个直接引用变量的对象。有些是NSString,有些是unsigned int,等等。我觉得键值编码是可以编写脚本的,因为我可以编写如下代码: id key, value; key = [[attributes objectAtIndex:j] name]; value = [[attributes objectAtIndex:j] stringValue]; [obj setValue:value forKey:key]; 我在这里使用string

我有一个直接引用变量的对象。有些是NSString,有些是unsigned int,等等。我觉得键值编码是可以编写脚本的,因为我可以编写如下代码:

   id key, value;
   key      = [[attributes objectAtIndex:j] name];
   value    = [[attributes objectAtIndex:j] stringValue];
   [obj setValue:value forKey:key];
我在这里使用stringValue和name的原因是我正在使用TouchXML并从XML提要构建对象

如果我试图给整数赋值,上面的代码就会崩溃。如果我将unsigned int更改为NSString的实例,则不会出现任何运行时崩溃。据我所知,键值编码足够聪明,可以检测这些问题

我可能的解决方案是什么?如何尽可能多地抽象它,以便在许多不同的类上运行相同的方法,这些类都有自己的实例变量


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

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

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

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