Оптимальный способ инициализации различных объектов - PullRequest
0 голосов
/ 25 апреля 2010

Я должен инициализировать множество различных типов объектов на основе целочисленного параметра. Все они имеют одинаковые общие методы инициализации.

На данный момент у меня есть следующий код

#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 ]

3 голосов
/ 25 апреля 2010

Вам нужно отображение число -> введите где-нибудь, но вам не нужно повторять код:

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 голос
/ 25 апреля 2010

Я не думаю, что что-то не так с тем, что вы делаете (хотя использование перечислимого типа может быть менее подвержено ошибкам, чем #define s), но вы можете проверить NSClassFromString(), что делает название подсказывает:

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

Впрочем, это может также слегка ухудшить производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...