gpt4 book ai didi

iPhone:使用反射替换函数

转载 作者:行者123 更新时间:2023-12-03 21:04:30 24 4
gpt4 key购买 nike

我有一个小函数,我想重写它,以便该函数对每个类都有效。目前我有 10 个相同的函数,它们的工作原理都相同,但每个函数都用于另一个类。我知道,我必须通过反射(reflection)来做到这一点,但我不太确定该怎么做。我已经读过这个链接: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

我所说的功能是:

-(NSCountedSet *)MissionGetReferecedNested:(id)modelObject
{
setOfObjects = [[NSCountedSet alloc]initWithArray:modelObject.MissionSectionList];
return setOfObjects;
}
-(NSCountedSet *)MissionGetSectionReferecedNested:(id)modelObject
{
setOfObjects = [[NSCountedSet alloc]initWithArray:modelObject.DamageAccountList];
return setOfObjects;
}

MissionSectionList 和 DamageAccountList 都是来自两个不同类的 NSMutableArray。是否可以查看一个类是否包含 NSMutableArray,如果是,那么它应该调用 .... modelObject.MyMutableArray?

最佳答案

您可以像这样使用反射:

- (NSCountedSet *)MissionGet:(id)modelObject
{
SEL propertySelector = NULL;

if ([modelObject respondsToSelector:@selector(MissionSectionList)]) {
propertySelector = @selector(MissionSectionList);
} else if ([modelObject respondsToSelector:@selector(DamageAccountList)]) {
propertySelector = @selector(DamageAccountList);
}

if (!propertySelector) {
[NSException raise:@"Invalid modelObject value" format:@"Model object %@ does not contain any recognised selectors", modelObject];
}

return [[NSCountedSet alloc] initWithArray:[modelObject performSelector:propertySelector]];
}

但是 cocoa 程序员中更常见的技术是:

- (NSCountedSet *)MissionGet:(id <MyCustomProtocol>)modelObject
{
return [[NSCountedSet alloc] initWithArray:[modelObject missionArray]];
}

您可以在其中接受符合协议(protocol)MyCustomProtocol任何对象。该协议(protocol)在头文件中的某处定义,使用:

@protocol MyCustomProtocol

@property (readonly) NSArray *missionArray;

@end

然后在每个类中,将其声明为实现协议(protocol):

@interface MissionSectionListClass <MyCustomProtocol>

并添加方法实现:

@implementation MissionSectionListClass <MyCustomProtocol>

- (NSArray *)missionArray
{
return self.MissionSectionList;
}

@end

使用协议(protocol)需要更多代码,但这是“正确”的方法。它允许您添加对新类的支持,而无需对 MissiongGet... 方法进行任何更改。

有关协议(protocol)的更多信息:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html

关于iPhone:使用反射替换函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8778911/

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