gpt4 book ai didi

objective-c - 创建一个使用相同接口(interface)包装另一个对象的 Objective-C 对象 - KVC/KVO 问题

转载 作者:搜寻专家 更新时间:2023-10-30 19:48:44 25 4
gpt4 key购买 nike

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

- (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 名称。第一个选项绝对是最好的。

关于objective-c - 创建一个使用相同接口(interface)包装另一个对象的 Objective-C 对象 - KVC/KVO 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3568819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com