您必须覆盖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 名称的属性。第一个选项绝对是最好的。