类方法的常量NSDictionary / NSArray

时间:2010-04-12 03:32:15

标签: objective-c nsarray nsdictionary constants

我正在尝试编写各种各样的全局查找表。

我将游戏数据以字符/字符串格式存储在plist中,但在加载时需要采用整数/ id格式。

例如,在关卡数据文件中,“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 个答案:

答案 0 :(得分:13)

如果您希望数组可用于您班级中的所有代码,只需在@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

答案 1 :(得分:3)

声明它static所以它只需要创建一次。