初始化不同对象的最佳方法

时间:2010-04-24 22:38:30

标签: iphone c objective-c cocoa

我必须基于整数参数初始化许多不同类型的对象。它们都具有相同的整体初始化方法。

目前我有以下代码

#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时,我必须在这里添加另一行。

什么是更好的方式?

2 个答案:

答案 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];
}

但是,这可能也会有轻微的性能影响。