2

有没有办法简化这种方法?也许一种将 && 两个语句放在一个 for- 循环中的方法?

// Enable valid decimal buttons
- (IBAction)enableDecimalValues 
{
    for(UIButton *decimalButton in nonOctalValueCollection)
    {
        decimalButton.enabled = YES;
        [decimalButton setAlpha:1];
    }

    for(UIButton *decimalButton in nonBinaryValueCollection)
    {
        decimalButton.enabled = YES;
        [decimalButton setAlpha:1];
    }
}
4

4 回答 4

4

您的代码本身没有任何“错误”。您在这里拥有的是清晰度;读者可以快速看到并理解正在发生的事情。

替代方案需要分配内存和复制对象,这样你就可以有 1 个循环。但最终,性能更差(严格来说)。

但是,如果你坚持,这个怎么样:

NSMutableArray *buttons = [[[NSMutableArray alloc] initWithArray:nonOctalValueCollection] autorelease];
[buttons addObjectsFromArray:nonBinaryValueCollection];

for(UIButton *decimalButton in buttons)
{
    decimalButton.enabled = YES;
    [decimalButton setAlpha:1];
}

autorelease如果您使用的是 ARC,请忽略。)

于 2012-04-04T20:58:37.170 回答
4

在我看来,您正试图使其干燥,而重复的部分是循环体中发生的事情。我认为不需要分配一个新数组,因此您只需遍历一个集合,所以我会做这样的事情

void (^block)(UIButton *button, NSUInteger idx, BOOL *stop) = 
^(UIButton *button, NSUInteger idx, BOOL *stop) {
    button.enabled = YES;
    button.alpha   = 1.0f;
};

[nonOctalValueCollection  enumerateObjectsUsingBlock:block];
[nonBinaryValueCollection enumerateObjectsUsingBlock:block];

这个 DRY 完成了并且不会导致临时数组的额外分配。

于 2012-04-04T21:18:26.020 回答
2

认为这是您可以做到的最简单的方法。或者,您可以将代码重构为另一种方法,并将两个数组都传递给该方法。

NSMutableArray *allButtons = [NSMutableArray array];
[allButtons addObjectsFromArray:nonOctalValueCollection];    
[allButtons addObjectsFromArray:nonBinaryValueCollection];

for (UIButton *button in allButtons) {
    button.enabled = YES;
    button.alpha = 1;
}
于 2012-04-04T20:59:13.250 回答
1

怎么样:

- (IBAction)enableDecimalValues 
{
    NSArray *combinedArray =
                [nonOctalValueCollection
                       arrayByAddingObjectsFromArray:nonBinaryValueCollection];

    [combinedArray makeObjectsPerformSelector:@selector(setEnabled:)
                                   withObject:[NSNumber numberWithBool:YES]];

    [combinedArray makeObjectsPerformSelector:@selector(setAlpha:)
                                   withObject:[NSNumber numberWithFloat:1.0f]];
}

或者:

- (IBAction)enableDecimalValues 
{
    NSArray *combinedArray =
                [nonOctalValueCollection
                       arrayByAddingObjectsFromArray:nonBinaryValueCollection];

    [combinedArray enumerateObjectsUsingBlock:
         ^(UIButton *button, NSUInteger idx, BOOL *stop)
         {
              button.enabled = YES;
              button.alpha = 1.0f;
         }];
}

导致:

- (IBAction)enableDecimalValues 
{
    [[nonOctalValueCollection
           arrayByAddingObjectsFromArray:nonBinaryValueCollection]
                enumerateObjectsUsingBlock:
                     ^(UIButton *button, NSUInteger idx, BOOL *stop)
                     {
                          button.enabled = YES;
                          button.alpha = 1.0f;
                     }];
}
于 2012-04-04T21:08:44.027 回答