2013-09-23 57 views
1

請幫我構建一個多維查找表,我想擺脫該死的箭頭反模式,而不是使用ifs和開關。三維查找字典的圖像?

我有兩個UIControlStates

UIControlStateNormal UIControlStateHighlighted

雙方定義爲枚舉

EnumSideLeft
EnumSideRight

和兩個色調爲ENUM

EnumShadeLight EnumShadeDark

這是一個2 x 2 x 2的立方體。對於每個細胞/三個組合,我有一個獨特的圖片。

我想要一個遍歷配置字典的類方法,並返回一個UIimage +一個提供配置字典本身的類方法。

但我不知何故無法找出一種有效的方法來定義該字典使用現代文字方法+使用字典該立方體的層次結構。

回答

1

我可能會採取CouchDeveloper暗示的方法,但如果你想專門沿着你在你的問題描述線的東西,你可以試試下面的:

static NSDictionary *configDict; 

typedef NS_ENUM(NSUInteger, BDSide) { 
    BDSideLeft, 
    BDSideRight 
}; 


typedef NS_ENUM(NSUInteger, BDShade) { 
    BDShadeLight, 
    BDShadeDark 
}; 


+ (UIImage *)configurationForState:(UIControlState)state Side:(BDSide)side Shade:(BDShade)shade 
{ 
    UIImage *result = nil; 

    NSDictionary *stateDictionary = [configDict objectForKey:@(state)]; 
    NSDictionary *sideDictionary = [stateDictionary objectForKey:@(side)]; 

    result = [sideDictionary objectForKey:@(shade)]; 
    return result; 
} 


+(void)initialize 
{ 
    configDict = @{@(UIControlStateNormal): 
        @{@(BDSideLeft): 
         @{@(BDShadeLight): [UIImage imageNamed:@"normal-left-light.png"], 
         @(BDShadeDark): [UIImage imageNamed:@"normal-left-dark.png"]}, 
         @(BDSideRight): 
         @{@(BDShadeLight): [UIImage imageNamed:@"normal-right-light.png"], 
          @(BDShadeDark): [UIImage imageNamed:@"normal-right-dark.png"]}}, 
       @(UIControlStateHighlighted): 
        @{@(BDSideLeft): 
         @{@(BDShadeLight): [UIImage imageNamed:@"highlight-left-light.png"], 
          @(BDShadeDark): [UIImage imageNamed:@"highlight-left-dark.png"]}, 
        @(BDSideRight): 
         @{@(BDShadeLight): [UIImage imageNamed:@"highlight-right-light.png"], 
          @(BDShadeDark): [UIImage imageNamed:@"highlight-right-dark.png"]}}}; 
} 
4

您可以使用一個特殊關鍵一個NSDictionary

NSDictionary* images = ...; 

int x,y,z = ...; 
NSString* key = [NSString stringWithFormat:@"%d,%d,%d", x,y,z); 

UIImage* image = images[key]; 

這只是一個想法。您也可以將您的密鑰構造爲具有移位和按位或運算的整數,例如:

int key = (z<<4) | (y<<2) | x; 

然後爲密鑰創建一個NSNumber。這比生成NSString要快。

+0

尼斯和清潔。 – John

+0

M.伯克的答案更接近我的需求,但這個也很好,所以我「分裂」了分數。 –