我有一个直接实例变量的对象。有些是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处理了?
答案 0 :(得分:3)
KVC在内部不进行任何类型强制/转换,因此传递给setValue:forKey:
的对象类型必须与它将存储的实例变量的类型相匹配。本机类型如{{1 },int
等被打包到long
个对象中,诸如结构之类的东西被打包到NSNumber
个对象中。要设置声明为本机类型的值,您应该为value参数传递适当的包装器对象。
我还建议在调用setter的代码中进行任何必需的翻译,而不是在setter本身。这更像是一个意见问题,所以我想如果你真的想,你可以在setter中翻译一些内容。我的代码版本如下所示:
NSValue