4

我需要在一个类层次结构中创建一个对象,该对象包装来自不同对象的对象。它们都有非常相似的接口,我想自动让我的包装器将它无法识别的消息转发给它的目标,而不是实现它自己的属性。我用这样的东西让它工作:

- (id)forwardingTargetForSelector:(SEL)sel
{
    if ([self.wrappedObject respondsToSelector:sel])
        返回 self.wrappedObject;

    回归自我;
}

但这不适用于键值编码。如何让我的包装器以使用其包装对象的属性的方式实现键值编码?

4

1 回答 1

1

您必须覆盖valueForKey:setValue:forKey:. 一个例子:

- (id)valueForKey:(NSString *)key {
  if (/* wrapped object has key */)
    return [self.wrappedObject valueForKey: key];
  else
    return [super valueForKey: key];
}

棘手的部分是确定包装对象确实实现的键。简单的方法是对它们进行硬编码,但这不太好。如果您想非常通用,您将使用 Objective-C 的反射 API 来做一些事情。这里有两个想法:

  • 您的所有属性实际上都是声明的属性。您可以使用运行时函数 class_getProperty 来检查它的存在,并可选择提取其他信息。然后检查可能如下所示if (class_getProperty([self.wrappedObject class], [key UTF8String]) != nil) {...}

  • 您的属性也可以只有访问器。然后你应该从键构造选择器并[self.wrappedObject respondsToSelector: ...]像以前一样使用。getter 的名称是键加冒号。但是,问题在于具有不同 getter/setter 名称的属性。第一个选项绝对是最好的。

于 2010-08-25T18:39:03.450 回答