2010-04-12 69 views
4

我正在尝试编写排序的全局查找表。用于类方法的常量NSDictionary/NSArray

我有在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。

请告诉我一个更好的办法....

回答

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

啊,所以'+ initialize'初始化类级内容?一旦我假设它被调用? – 2010-04-12 04:06:17

+1

是的;它相当于init,但是对于类。通常在初始化调用中检查类,以防止子类重置类变量。上面的代码应该是安全的。 – 2010-04-12 05:01:34

+0

谢谢。如果您不知道Google应该搜索哪些内容,有时候会使用Google进行搜索。 – 2010-04-12 05:51:47

3

声明它static,因此只需要创建一次。