强制KVC类型

时间:2011-03-17 20:02:46

标签: cocoa ios macos cocoa-bindings

我想解析XML以填充符合KVC的对象但是,我的解析器非常愚蠢,它只是从XML属性/标签组装NSStrings并尝试通过KVC设置它们。

这适用于实际的字符串和数字(​​我相信),但我还需要设置日期。问题显然是解析器不知道字符串代表一个日期,并且它试图使用vanilla KVC调用它 - 之后KVC框架抱怨类型不匹配(在日期字段上设置字符串)。

是否有一种编程方式可以“拦截”调用到KVC框架中,以便我可以更改正在设置的数据(通过NSDateFormatter运行日期字符串)?

我可以在解析器中加入一些智能,但在此之前,还有其他众所周知的解决方案可以解决这类问题吗?

2 个答案:

答案 0 :(得分:2)

这可能不是完美的解决方案,但是......我想分享我的想法;)

首先,请看一下:Key-Value Coding - Validation。该文档描述了一种在通过KVC设置变量时验证变量的简洁方法。你可以通过以下方式利用这个优势:

  1. 首先为您的类变量
  2. 实施KV验证方法
  3. 设定您的价值
  4. 在您的验证方法中,检查它是否是日期/字符串/您想要的任何内容 - 并将其更改为正确的类型。
  5. 这应该提供一个干净的实现,以确保正确的类型。

    干杯, 的Pawel

答案 1 :(得分:0)

使用KVC,一切都经过setValue:forKey:的默认实现,它们调用适当的mutator方法(as described here)。

您可以覆盖setValue:forKey:来检查需要转换的一个或多个键,并进行适当的更改。

- (void)setValue:(id)value forKey:(NSString *)key
{
    if([key isEqualToString:@"someDate"]) {
        NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
        someDate = [dateFormatter dateFromString:value];
        value = somedate;
    }

    [super setValue:value forKey:key];
}

那是来自内存的,所以无法保证它是否真的可以编译和运行。 ; - )