0

Objective-C を使い始めたばかりで、改善したい iOS プログラムを作成しました。その中には、次の 2 つのコード ブロックがあります。

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]ます。

編集:最初の辞書から2番目の辞書を生成する

// 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 が正解で、 anNSDictionaryを使用する必要があります。ただし、このディクショナリは、複数回使用されることを前提として、一度だけ生成する必要があります。

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" は 1 ではなく 6 になります。これは、列挙が連続しているためです。次のラベルは前のラベルから +1 の値を取ります。

申し訳ありませんが、ラベルの技術的な名前はわかりません。ラベルと呼んでいます:P

于 2012-10-30T13:41:10.120 に答える