2010-04-24 74 views
0

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

此刻,我有以下代码

#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

请问您的课堂上所被设计成这样呢?看起来有一个Class参数和[[thatClass alloc] init]会更有意义。 – Chuck 2010-04-24 23:54:18

回答

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]; 
+0

出于兴趣,是否有[FPear类]存储自己的ID的方法,以便我可以写[NSNumber numberWithInt:[[FPear class] id]]? – 2010-04-24 23:14:02

+0

@John:当然,你可以使用一个类的方法,例如'+(的NSNumber *)myId'。 – 2010-04-24 23:36:11

1

我不认为你在做什么有什么问题(虽然使用枚举类型的可能性不如#define s),但你可能想看看NSClassFromString(),它的名称的确如此:

- (id)newFruit:(NSString *)classString { //pass in @"FApple" or @"FPear" 
    Class fruitClass = NSClassFromString(classString); 
    return [[fruitClass alloc] init]; 
} 

虽然这也可能有轻微的表现。