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

雖然這也可能有輕微的表現。