1

これは、これをできるだけ少ないコードで効率的にコーディングする方法に関する質問です。すでに機能していますが、 paramenter を組み込む必要がありnumberOfShapesます。1なら■、2なら■■、3なら■■■など…

if ステートメントと追加の return ステートメントを追加できます。正方形の場合 -> 数値 = 1> の場合は ■ が返され、数値 >2 の場合は ■■ が返されます。

最小限のコードでこれをコーディングする最良の方法は何ですか?

- (NSString *)getShape: (NSNumber *)shape numberOfShapes: (NSNumber *)number
{
    if ([shape isEqualToNumber:[NSNumber numberWithInt:SQUARE]]) return @"■";
    if ([shape isEqualToNumber:[NSNumber numberWithInt:CIRCLE]]) return @"●";
    if ([shape isEqualToNumber:[NSNumber numberWithInt:TRIANGLE]]) return @"▲";

    return @"?";
}
4

5 に答える 5

6

非常に重いパフォーマンス要件がない限り、主に好みの問題です。

それを行う 1 つの方法は、数字からグリフへのマップを使用して辞書を設定することです。

静的変数があると仮定してglyphs、クラスのinitializeメソッドで初期化します。

static NSDictionary *glyphs;

+ (void)initialize 
{
    glyphs = @{
      @(SQUARE):@"■",
      @(CIRCLE):@"●",
      @(TRIANGLE):@"▲"
    };
}

次に、あなたがしなければならないことは次のとおりです。

- (NSString *)shapeForNumber:(NSInteger)shape 
{
    NSString *glyph = [glyphs objectForKey: [NSNumber numberWithInteger: shape]];

    return glyph ? glyph : @"?";
}
于 2013-02-15T16:34:52.077 に答える
3
- (NSString *)getShape: (NSNumber *)shape numberOfShapes: (NSNumber *)number
{
    unsigned shapeInt = [shape unsignedIntValue];
    if (shapeInt >= 3)
        return @"?";
    NSString *shapeStr = [@"■●▲" substringWithRange:NSMakeRange(shapeInt, 1)];

    // Add autorelease here, if using MRR...
    NSMutableString *result = [[NSMutableString alloc] init];

    unsigned numberInt = [number unsignedIntValue];
    for (unsigned i = 0; i < numberInt; i++)
        [result appendString:shapeStr];
    return result;
}

オブジェクトを使用してこのようなパラメーターを渡す意味がわかりません。単純なことやできることNSNumberは何もできず、使用するのに費用がかかるためです。NSUIntegerunsigned

于 2013-02-15T16:28:35.957 に答える
3

コードに実証されたパフォーマンスの問題はありますか? そうでなければ、スイッチはかなり明確だと思います。または、より少ない行と O(1) は...

// declare this earlier
static NSArray *shapeChars = @[ @"■", @"●" /* etc. */ ];

// then
return [shapeChars objectAtIndex:[shape intValue]];
于 2013-02-15T16:34:27.523 に答える
2

ループの概念に入ります。また、なぜNSNumberこれに s を使用するのですか? 普通の古いintもので十分です。

- (NSString *)getShape:(int)shape numberOfShapes:(int)number
{
    if (shape == SQUARE]) return [self shapeRepeated:@"■" nTimes:number];
    if (shape == CIRCLE]]) return [self shapeRepeated:@"●" nTimes:number];
    if (shape == TRIANGLE]]) return [self shapeRepeated:@"▲" nTimes:number];

    return @"?";
}

- (NSString *)shapeRepeated:(NSString *)shape nTimes:(int)n
{
    return [@"" stringByPaddingToLength:n withString:shape startingAtIndex:0];
}
于 2013-02-15T16:30:01.920 に答える
0
- (NSString *)getShape: (NSNumber *)shape numberOfShapes: (NSNumber *)number
{
    switch([number intValue]): {
        case SQUARE: return @"■";
        case CIRCLE: return @"●";
        case TRIANGLE: return @"▲";
        default: return @"?";
    }
}

「数」を組み込むには:

- (NSString *)getShape: (NSNumber *)shape numberOfShapes: (NSNumber *)number
{
    NSString* result = nil;
    switch([number intValue]): {
        case SQUARE: result = @"■"; break;
        case CIRCLE: result = @"●"; break;
        case TRIANGLE: result= @"▲"; break;
        default: result = @"?";
    }
    NSString* realResult = @"";
    for (int i = 0; i < number; i++) {
       realResult = [realResult stringByAppendingString:result];
    }
    return realResult;
}

結果に char 値を使用することできれいにできますが、私は怠け者です。

于 2013-02-15T18:21:30.977 に答える