Константа NSDictionary / NSArray для методов класса - PullRequest
4 голосов
/ 12 апреля 2010

Я пытаюсь закодировать глобальную таблицу поиска.

У меня есть игровые данные, которые хранятся в формате символов / строк в plist, но при загрузке они должны быть в формате целых чисел / идентификаторов.

Например, в файле данных уровня "p" означает проигрыватель. В игровом коде игрок представлен как целое число 1. Это позволяет мне выполнять побитовые операции и т. Д. Я здесь значительно упрощаюсь, но пытаюсь донести смысл. Кроме того, есть преобразование в координаты для спрайта на листе спрайта.

Прямо сейчас это преобразование строки -> целое число, целое число -> строка, целое число -> координата и т. Д. Выполняется в нескольких местах кода с использованием оператора case. Конечно, это воняет, и я бы предпочел сделать это с помощью поиска по словарю.

Я создал класс levelInfo и хочу определить словарь для этого преобразования, а затем методы класса для вызова, когда мне нужно выполнить преобразование или иным образом работать с данными уровня.

NSString *levelObjects = @"empty,player,object,thing,doohickey";
int levelIDs[] = [0,1,2,4,8];
// etc etc

@implementation LevelInfo

+(int) crateIDfromChar: (char) crateChar {
    int idx = [[crateTypes componentsSeparatedByString:@","] indexOfObject: crateChar];
    return levelIDs[idx];
}

+(NSString *) crateStringFromID: (int) crateID {
    return [[crateTypes componentsSeparatedByString:@","] objectAtIndex: crateID];
}

@end

Есть ли лучший способ сделать это? Кажется неправильным создавать эти временные массивы или словари или что-то еще для каждого вызова, чтобы сделать этот перевод. И я не знаю, как объявить константу NSArray или NSDictionary.

Пожалуйста, расскажите мне лучше ...

Ответы [ 2 ]

13 голосов
/ 12 апреля 2010

Если вы хотите, чтобы массив был доступен для всего кода в вашем классе, просто объявите его вне контекста @implementation, а затем инициализируйте его в методе +initialize вашего класса.

NSArray *levelObjects;

@implementation LevelInfo

+ (void) initialize
 {
 if (!levelObjects)
   levelObjects = [[NSArray alloc]
    initWithObjects:@"empty",@"player",@"object",@"thing",@"doohickey",nil];
 }

// now any other code in this file can use "levelObjects"

@end
3 голосов
/ 12 апреля 2010

Объявите его static, поэтому его нужно создать только один раз.

...