0

我刚刚开始使用 Objective-C,并创建了一个我想改进的 iOS 程序。在其中,我有两个代码块:

if ([stringTest isEqualToString:@"apple"]){
    numTest=0;
}else if (([stringTest isEqualToString:@"orange"])||([stringTest isEqualToString:@"lemon"])){
    numTest=1;
}else if ([stringTest isEqualToString:@"pumpkin"]){
    numTest=2;   // and so on...

然后反过来:

  if (numTest==0){
        stringTest=@"apple";
    } else if (numTest==1){
        stringTest=@"orange/lemon";
    } else if (numTest==2){
        stringTest=@"pumpkin";  // and so on...

由于这些列表实际上涉及更多项目,我相信有更好的方法来做到这一点。任何建议将不胜感激。谢谢阅读。

4

3 回答 3

2

我建议设置将字符串映射到数字和数字到字符串的 NSDictionaries。使用新的对象字面量语法:

NSDictionary* numberLookup = @{@"apple": @0, @"orange", @1, @"lemon", @2, @"pumpkin": @3};
numTest = [numberLookup objectForKey:stringTest];

NSDictionary* stringLookup = @{@0, @"apple", @1, "orange/lemon", .....
stringTest = [stringLookup objectForKey:numTest];

NSDictionary 的字面语法是@{key: value, ...}. 注意在数值之前使用@符号;NSDictionary 期望所有的键和值都是对象。@1相当于[NSNumber numberWithInt:1]。并且字典文字语法类似于[NSDictionary dictionaryWithObjectsAndKeys:@0, @"apple", ..., nil].

编辑:从第一个字典生成第二个字典

// Map strings to numbers
NSDictionary* numberLookup = @{@"apple": @0, ...};

// Map numbers to strings
NSMutableDictionary* stringLookup = [NSMutableDictionary dictionaryWithCapacity:numberLookup.count];
for (str in numberLookup) {
    id num = [numberLookup objectForKey:str];
    if ([stringLookup objectForKey:num]) {
        NSString* currentStr = [stringLookup objectForKey:num];
        [stringLookup setObject:[NSString stringWithFormat:@"%@/%@", currentStr, str] forKey:num]
    } else {
        [stringLookup setObject:str forKey:num];
    }
}
于 2012-10-30T13:28:19.267 回答
1

对于获取字符串的数字,@esker 是正确的,NSDictionary应该使用 an。然而,这个字典应该只生成一次,假设它被多次使用:

static NSDictionary *numberForFruit = nil;
if (!numberForFruit) {
    NSUInteger numberOfStrings = 4;
    NSMutableDictionary *mutableNumberForFruit = [NSMutableDictionary dictionaryWithCapacity:numberOfStrings];
    #define addNumberForFruitToMutableNumberForFruit(number,fruit) [mutableNumberForFruit setObject:[NSNumber numberWithInt:number] forKey:@#fruit];
    addNumberForFruitToMutableNumberForFruit(0, apple);
    addNumberForFruitToMutableNumberForFruit(1, orange);
    addNumberForFruitToMutableNumberForFruit(1, lemon);
    addNumberForFruitToMutableNumberForFruit(2, pumpkin);
    numberForFruit = [mutableNumberForFruit copy];
}

然而,换个方向,使用 switch 语句会好得多:

switch (numTest) {
    case 0: {
        strings = @[@"Apple"];
    } break;
    case 1: {
        strings = @[@"Orange", @"Lemon"];
    } break;
    case 2: {
        strings = @[@"Pumpkin"];
    } break;
}
于 2012-10-30T14:09:01.830 回答
0

不确定您将其用于什么,但我想如果您的数字是连续的,您也可以使用枚举:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    enum fruits 
    { 
        apple = 0, 
        banana, 
        orange 
    };

    NSLog(@"Apple is: %d", apple);
    NSLog(@"Banana is: %d", banana);
    NSLog(@"Orange is: %d", orange);

    return 0;
}

输出将是:

2012-10-30 21:40:45.758 TestEnum[1274:403] Apple is: 0
2012-10-30 21:40:45.761 TestEnum[1274:403] Banana is: 1
2012-10-30 21:40:45.762 TestEnum[1274:403] Orange is: 2

请注意,您指定枚举标签的顺序很重要。在这种情况下,我告诉“apple”从 0 开始。

我可以很好地告诉“apple”从 5 开始,如果我这样做,“banana”将变为 6 而不是 1,因为枚举是连续的,下一个标签将采用前一个标签的 +1 值。

抱歉,我不知道标签的技术名称是什么,我称它们为标签:P

于 2012-10-30T13:41:10.120 回答