1

这是一个关于如何用尽可能少的代码有效地编写代码的问题。它已经有效,但我需要加入 paramenter numberOfShapes。如果 1 返回■,如果 2 ■■,如果 3 ■■■ 等等...

我可以做一些额外的 if statemets 和额外的 return 语句。如果 Square->if number = 1> return ■,if number >2 return ■■ 等等。但是对于一些非常简单的事情来说,这是一大堆代码。

用最少的代码进行编码的最佳方法是什么?

- (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

除非您有一些非常严格的性能要求,否则很大程度上是一个品味问题。

一种方法是建立一个字典,其中包含从数字到字形的映射。

假设您有一个静态变量,请在类的方法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

输入循环的概念。另外,你为什么用NSNumbers 来做这个?普通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 回答