【问题标题】:Constant NSDictionary/NSArray for class methods类方法的常量 NSDictionary/NSArray
【发布时间】:2010-04-12 03:32:15
【问题描述】:

我正在尝试编写一个全局查找表。

我有游戏数据以字符/字符串格式存储在 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。

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

【问题讨论】:

    标签: objective-c nsarray nsdictionary constants


    【解决方案1】:

    如果您希望类中的所有代码都可以使用一个数组,只需在 @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 初始化类级内容?一旦我假设它就会被调用?
    • 是的;它等效于 init,但用于类。在初始化调用中检查类是常规的,以防止子类重置您的类变量。上面的代码应该是安全的。
    • 谢谢。有时,当您不知道要使用 Google 搜索什么时,Google 搜索会很困难。
    • 不要依赖 +initialize 只发送一次。防守编码;这就是为什么我在那里有 if (!levelObjects) 测试。
    • 这是一个全局变量吗?不应该是static NSArray *levelObjects;吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多