2012-06-05 55 views
0

我正在尋找很好的解決方案的問題。 我需要大約20多個字符串常量(資源文件名)。但我需要:NSDictionary與字符串常量和ID

  1. 組常數(文件名)
  2. 通過迭代常量的選定組通過其ID
  3. 訪問常量

所以我找到了最好的解決方案是創建對於每個具有常量值和ID的組的常量NSDictionary。 我想使用enum來存儲常量ids,但int不能用作NSDictionary中的鍵。

typedef enum { 
    kSoundColorSelection1 = 0, 
    kSoundColorSelection2, 
    kSoundColorSelection3, 
    kSoundFill1, 
    kSoundFill2, 
    kSoundSizeSelectionBig, 
    kSoundSizeSelectionMedium 
} ACSoundId; 

「最簡單」的方式被明確轉換intNSNumber

templatesSounds = [[NSDictionary alloc] initWithObjectsAndKeys:@"album_close.caf",[NSNumber numberWithInt:kSoundAlbumClose], 
       @"album_open.caf", [NSNumber numberWithInt:kSoundAlbumOpen], nil]; 

是否有任何其他方式保持常量在這種情況下? 謝謝!

+0

可以使用NSNumber作爲字典中的鍵。 –

+0

既然你想使用整數值作爲鍵,我會建議明確設置枚舉中的所有值。 – Joe

+0

爲什麼不把它們從筆尖加載? –

回答

2

有兩種可能的方法可以使這更容易。

解決方案1 ​​ 如果您使用的是ACSoundId爲重點,以你的NSDictionary,你可以只使用一個NSArray:

typedef enum { 
    kSoundColorSelection1  = 0, 
    kSoundColorSelection2  = 1, 
    kSoundColorSelection3  = 2, 
    kSoundFill1    = 3, 
    kSoundFill2    = 4, 
    kSoundSizeSelectionBig  = 5, 
    kSoundSizeSelectionMedium = 6 
} ACSoundId; 

存儲在同一順序的數組它們在定義的聲音以上枚舉:

templatesSounds = [[NSArray alloc] initWithObjects:@"color_selection1.caf", 
    @"color_selection2.caf", 
    @"color_selection3.caf", 
    @"color_fill1.caf", 
    @"color_fill2.caf", 
    @"size_selection_big.caf", 
    @"size_selection_medium.caf", 
    nil]; 

由於聲音的索引將關聯到枚舉的值,它的工作類似於NSDirectory:

queuedSound = [templatesSounds objectAtIndex:kSoundColorSelection2]; 

解決方案2 或者你可以創建一個類,以使其更容易在一個NSDictionary使用整數作爲鍵:

定義類別:

@interface NSMutableDictionary (NSNumberDictionary) 
- (void) setObject:(id)anObject forNumber:(NSInteger)aNumber; 
- (void) removeObjectForNumber:(NSInteger)aNumber; 
- (id) objectForNumber:(NSInteger)aNumber; 
@end 

落實類別:

@implementation NSMutableDictionary (NSNumberDictionary) 
- (void) setObject:(id)anObject forNumber:(NSInteger)aNumber 
{ 
    NSNumber * number; 
    number = [[NSNumber alloc] initWithInteger:aNumber]; 
    [self setObject:anObject forKey:number]; 
    [number release]; 
    return; 
} 
- (void) removeObjectForNumber:(NSInteger)aNumber 
{ 
    NSNumber * number; 
    number = [[NSNumber alloc] initWithInteger:aNumber]; 
    [self removeObjectForKey:number]; 
    [number release]; 
    return; 
} 
- (id) objectForNumber:(NSInteger)aNumber 
{ 
    NSNumber * number; 
    id   object; 
    number = [[NSNumber alloc] initWithInteger:aNumber]; 
    object = [self objectForKey:number]; 
    [number release]; 
    return(object); 
} 
@end 

使用類別:

templatesSounds = [[NSMutableDictionary alloc] initWithWithCapacity1]; 
[templatesSounds setObject:@"color_selection1.caf" forNumber:kSoundColorSelection1]; 
[templatesSounds setObject:@"color_selection2.caf" forNumber:kSoundColorSelection2]; 
[templatesSounds setObject:@"color_selection3.caf" forNumber:kSoundColorSelection3]; 
[templatesSounds setObject:@"color_fill1.caf"  forNumber:kSoundColorFill1]; 
[templatesSounds setObject:@"color_fill2.caf"  forNumber:kSoundColorFill2]; 
+0

正如我告訴過的,我有幾個小組。一種解決方案 - 每組都有枚舉,但它會產生警告,因爲我使用ACSoundId作爲參數的類型。 – OgreSwamp

+0

@OgreSwamp你是什麼意思每個組的枚舉?您可以擴展您的代碼,以便我們可以更清楚地瞭解枚舉的使用方式嗎? –

1

如果你的「鍵」總是爲整數,爲什麼不使用正常的C數組呢?

NSString **templatesSounds ; 

int numConstants = 10; 
templatesSounds = calloc(numConstants , sizeof(NSString*)); 

templatesSounds[kSoundAlbumOpen] = @"album_open.caf"; 

NSString* soundName = templatesSounds [kSoundSizeSelectionMedium]; 

//... 
free (templatesSounds);