2010-04-12 57 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,因此只需要創建一次。

相關問題