代码之家  ›  专栏  ›  技术社区  ›  Jeff B

类方法的常量nsdictionary/nsarray

  •  4
  • Jeff B  · 技术社区  · 14 年前

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

    我有一个plist中以字符/字符串格式存储的游戏数据,但在加载时需要以integer/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 回复  |  直到 14 年前
        1
  •  13
  •   NSResponder    14 年前

    如果希望类中的所有代码都可以使用数组,只需在 @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
    
        2
  •  3
  •   Chuck    14 年前

    宣布它 static 所以它只需要创建一次。