我必须基于整数参数初始化许多不同类型的对象。它们都具有相同的整体初始化方法。
目前我有以下代码
#def APPLE 1
#def PEAR 2
switch (t)
{
case APPLE:
newobj = [[FApple alloc] init];
break;
case PEAR:
newobj = [[FPear] alloc] init];
break;
default:
retobj = nil;
}
我相信必须有更好的方法来做到这一点。当我添加FOrange时,我必须在这里添加另一行。
什么是更好的方式?
答案 0 :(得分:3)
您需要一个映射号码 - >在某处键入,但您不需要重复代码:
NSDictionary* d = [NSDictionary dictionaryWithObjectsAndKeys:
[FPear class], [NSNumber numberWithInt:PEAR ],
[FApple class], [NSNumber numberWithInt:APPLE],
nil];
Class c = [d objectForKey:[NSNumber numberWithInt:t]];
id x = [[c alloc] init];
答案 1 :(得分:1)
我认为您正在做的事情没有任何问题(尽管使用枚举类型可能比#define
更不容易出错),但您可能想要查看NSClassFromString()
,顾名思义:
- (id)newFruit:(NSString *)classString { //pass in @"FApple" or @"FPear"
Class fruitClass = NSClassFromString(classString);
return [[fruitClass alloc] init];
}
但是,这可能也会有轻微的性能影响。