常量NSDictionary/NSArray用于类方法

4

我试图编写一个全局查找表。

我的游戏数据以字符/字符串格式存储在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个回答

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

啊,所以+initialize初始化类级别的内容?我猜它只被调用一次? - Jeff B
1
是的,它相当于init,但用于类。惯例是在初始化调用中检查类,以防止子类重置您的类变量。上面的代码应该是安全的。 - Paul Lynch
谢谢。有时在不知道该搜索什么时,通过谷歌搜索可能会很困难。 - Jeff B
1
不要仅依赖于+initialize只被发送一次。进行防御性编程;这就是为什么我在那里加入if (!levelObjects)测试的原因。 - NSResponder
这是一个全局变量吗?它不应该是 static NSArray *levelObjects; 吗? - tehwalrus

3

将其声明为静态,这样只需要创建一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接