1

请帮我构建一个多维查找表,我想摆脱该死的箭头反模式,根本不使用 ifs 和 switch。

我有两个 UIControlStates

UIControlStateNormal UIControlStateHighlighted

定义为枚举的两侧

EnumSideLeft
EnumSideRight

和两个阴影作为枚举

EnumShadeLight EnumShadeDark

这是一个 2 x 2 x 2 的立方体。对于每个单元格/三个组合,我有一张独特的图片。

我想要一个遍历配置字典并返回 UIimage + 提供配置字典本身的类方法的类方法。

但是我不知何故无法找到一种有效的方法来使用现代文字方法定义该字典+使用字典的该立方体的层次结构。

4

2 回答 2

4

您可以将 aNSDictionary特殊键一起使用:

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.

于 2013-09-23T16:55:22.263 回答
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"]}}};
}
于 2013-09-23T20:21:21.847 回答