2011-03-17 174 views
1

我想解析XML来填充符合KVC的对象,但是,我的解析器非常笨拙,它只是从XML属性/标记组装NSStrings并尝试通过KVC设置它们。强制KVC类型

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

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

我可以在解析器中添加一些智能,但在这样做之前,有没有其他这种类型的问题的知名解决方案?

回答

2

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

所以,首先,看看这里:Key-Value Coding - Validation。该文档描述了一种在通过KVC设置时验证变量的简便方法。你可以使用你的优势是:

  1. 首先实现你的类变量KV验证方法
  2. 设置你的价值
  3. 在您的验证方法检查,如果它是一个日期/串/无论你想 - 和将其更改为适当的类型。

这应该提供一个干净的实现,以确保正确的类型。

干杯, 帕维尔

+0

+1我想我可能更喜欢使用验证来回答我的问题。如果有几个需要强制的属性,它肯定会使代码更加整洁。 – paulbailey 2011-03-17 20:46:42

+0

我看到了这个功能......但没有发现我实际上可以替换这个对象。好的电话。它也似乎是在现场级别实施,即:没有字段名称比较/查找(验证:错误:)我需要管理我正在替换的对象的内存吗?我敢打赌,我需要autorelease新的NSDate ...特别是如果它被设置(非原子,保留)财产。唯一的另一个问题是,这个领域的一些集合可能不需要转换为日期(他们已经是)。我会试着模拟一个性能测试。再次感谢! – 2011-03-17 21:28:46

0

随着KVC,一切都会通过默认实现setValue:forKey:这就是所谓的适当的增变器方法(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]; 
} 

,从内存的,所以不能保证是否会真正编译和运行。 ;-)

+0

感谢保罗。这绝对是一种可能性。从性能角度来看,我可能需要量化字符串比较的性能损失。另一个问题是...有时候,程序的其他部分可能会尝试在这个字段上设置一个真正的NSDate ......在这种情况下,我也必须检查类的类型。感谢您的建议。 – 2011-03-17 21:22:56

+0

如果有可能会传入正确的类型,那么我建议Pawel的答案。我认为字符串比较表现的不错,特别是在解析XML的情况下。 – paulbailey 2011-03-17 21:28:00