【问题标题】:Key-Value coding and its scripting capability键值编码及其脚本功能
【发布时间】:2010-09-27 18:34:35
【问题描述】:

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

   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 的实例,则不会出现任何运行时崩溃。据我了解,Key-Value 编码足够聪明,可以检测到这些问题。

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

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

【问题讨论】:

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


    【解决方案1】:

    KVC 在内部不进行任何类型强制/转换,因此您传递给 setValue:forKey: 的对象的类型必须与将要存储的实例变量的类型匹配。本机类型,例如 int、@ 987654323@ 等被打包到 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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多