创建一个Objective-C对象,该对象使用相同的接口包装另一个对象
发布时间:2020-12-16 06:54:41 所属栏目:百科 来源:网络整理
导读:我需要在一个类层次结构中创建一个对象,该对象包装来自不同对象的对象.它们都有非常相似的接口,我想自动将我的包装器转发消息无法识别到其目标,而不是实现自己的属性.我用这样的东西让它工作: - (id)forwardingTargetForSelector:(SEL)sel { if ([self.wrap
我需要在一个类层次结构中创建一个对象,该对象包装来自不同对象的对象.它们都有非常相似的接口,我想自动将我的包装器转发消息无法识别到其目标,而不是实现自己的属性.我用这样的东西让它工作:
- (id)forwardingTargetForSelector:(SEL)sel { if ([self.wrappedObject respondsToSelector:sel]) return self.wrappedObject; return self; } 但这不适用于键值编码.我怎样才能让我的包装器以一种使用其包装对象属性的方式实现键值编码? 解决方法
你必须覆盖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名称的属性.第一种选择绝对是最好的选择. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |