1

この状況に適しているのは、if-else と switch のどちらの構造ですか?

- (id)hexEvaluator:(double)remainder
{
    if(remainder == 0) {return [NSNumber numberWithInt:0];}
    else if(remainder == 1) {return [NSNumber numberWithInt:1];}
    else if(remainder == 2) {return [NSNumber numberWithInt:2];}
    else if(remainder == 3) {return [NSNumber numberWithInt:3];}
    else if(remainder == 4) {return [NSNumber numberWithInt:4];}
    else if(remainder == 5) {return [NSNumber numberWithInt:5];}
    else if(remainder == 6) {return [NSNumber numberWithInt:6];}
    else if(remainder == 7) {return [NSNumber numberWithInt:7];}
    else if(remainder == 8) {return [NSNumber numberWithInt:8];}
    else if(remainder == 9) {return [NSNumber numberWithInt:9];}
    else if(remainder == 10) {return @"A";}
    else if(remainder == 11) {return @"B";}
    else if(remainder == 12) {return @"C";}
    else if(remainder == 13) {return @"D";}
    else if(remainder == 14) {return @"E";}
    else if(remainder == 15) {return @"F";}
    else return nil;

    switch ((int)remainder) 
    {
        case 0:  return [NSNumber numberWithInt:0]; break;
        case 1:  return [NSNumber numberWithInt:1]; break;
        case 2:  return [NSNumber numberWithInt:2]; break;
        case 3:  return [NSNumber numberWithInt:3]; break;
        case 4:  return [NSNumber numberWithInt:4]; break;
        case 5:  return [NSNumber numberWithInt:5]; break;
        case 6:  return [NSNumber numberWithInt:6]; break;
        case 7:  return [NSNumber numberWithInt:7]; break;
        case 8:  return [NSNumber numberWithInt:8]; break;
        case 9:  return [NSNumber numberWithInt:9]; break;
        case 10: return @"A";; break;
        case 11: return @"B";; break;
        case 12: return @"C";; break;
        case 13: return @"D";; break;
        case 14: return @"E";; break;
        case 15: return @"F";; break;

        default: return nil; break;
    }
}

また、余談ですが、なぜ switch 式 (私の場合は残りの部分) を「double」型にすることが許可されていないのですか? コンパイルするには、「int」にキャストする必要がありました。

4

4 に答える 4

5

確かにif文。そして、余分な行をすべて取り除きます。

- (id)hexEvaluator:(double)remainder
{
    if (remainder < 10)
    {
        return [NSNumber numberWithInt:(int)remainder];
    }
    else if (remainder < 16)
    {
        return [NSString stringWithFormat:@"%X", (int)remainder)];
    }
    return nil;
}
于 2012-04-03T20:20:10.910 に答える
3

つまり、 if ステートメントはより複雑な条件を提供するため、この状況により適しています。


サンプルコード

あなたの場合、サンプル コードはメソッドの機能を置き換えることができます。

if (remainder < 10 ) {
    return [NSNumber numberWithInt:(int)reminder]; 
} else if (remainder < 16) {
    // Will return: "A", "B", "C", "D", "E" or "F"
    return [NSString stringWithFormat:@"%X", (int)remainder];
} else {
    return nil;
}

基数 10 の int を 16 進値に変換する方法は他にもあり、%x(小文字の場合) または%X(大文字の場合) のいずれかを使用して、16 進値を文字列として取得できます。単純


その他のソリューション

計算結果の使用方法によっては、リファクタリングしてさらに優れたコードを作成できる場合があります。

ユーザーに表示するために結果 (数値または文字列) のみを使用している場合は、おそらく NSNumbers も NSStrings に置き換えることができ、最初の if ステートメントを削除できます。

if (remainder < 16) {
    // Will return: "1", "2", "3", "4", ...,  "A", "B", "C", "D", "E" or "F"
    return [NSString stringWithFormat:@"%X", (int)remainder]; 
} else {
    return nil;
}

一方、何らかの計算に結果を使用している場合は、比較しやすいデータ型を使用することを検討する必要があります (どのように比較[NSNumber numberWithInt:9]してい@"A"ますか?)

次のようなコードで 16 進値を直接使用することもできます。

int hex = 0xC;
NSLog(@"hex = %X", hex); // Output: hex = C
NSLog(@"int = %d", hex); // Output: hex = 12

これにより、比較がはるかに簡単になります。

NSLog(@"%@ than 9", (hex > 0x9 ? @"bigger" : @"smaller")); // bigger than 9
NSLog(@"%@ than F", (hex > 0xF ? @"bigger" : @"smaller")); // smaller than F

コードをどのようにリファクタリングするかに応じて、意図をより明確に表すために名前を変更する必要があります。

于 2012-04-03T20:17:56.713 に答える
0

ケースにはintのラベルが付いており、タイプが一致しないため、doubleにすることはできません。

スイッチの方が見栄えは良いですが、{}を削除したifステートメントの方が優れていると思います。そうすれば、1行に1つのステートメントしかなく、すべてのグッドプラクティスが維持されます。

于 2012-04-03T20:12:35.143 に答える
0

これは役立つかもしれません

- (id)hexEvaluator:(double)remainder
{
    return remainder <= 9 ? [NSNumber numberWithInt:(int)remainder] : [NSString stringWithFormat:@"%X", (int)remainder)]; 
}
于 2012-04-03T20:23:23.897 に答える