Вы можете использовать отражение следующим образом:
- (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]];
}
Но более распространенным методом среди программистов какао будет:
- (NSCountedSet *)MissionGet:(id <MyCustomProtocol>)modelObject
{
return [[NSCountedSet alloc] initWithArray:[modelObject missionArray]];
}
Где бы вы приняли любой объект, который подтверждает протокол MyCustomProtocol
. Протокол определяется где-то в заголовочных файлах, используя:
@protocol MyCustomProtocol
@property (readonly) NSArray *missionArray;
@end
И затем в каждом из ваших классов объявите его как реализующий протокол:
@interface MissionSectionListClass <MyCustomProtocol>
И добавить метод реализации:
@implementation MissionSectionListClass <MyCustomProtocol>
- (NSArray *)missionArray
{
return self.MissionSectionList;
}
@end
Использование протоколов - это немного больше кода, но это "правильный" путь. Он позволяет добавлять поддержку новых классов без каких-либо изменений в методе MissiongGet...
.
Подробнее о протоколах: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html