无论如何要简化这个IBOutletConnection语句吗?

时间:2012-04-04 20:53:20

标签: iphone objective-c xcode iboutlet

有没有办法简化这种方法?也许是和&& amp;两个陈述在一个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 个答案:

答案 0 :(得分:4)

您的代码本身并没有“错误”。你在这里有清晰度;读者可以快速了解和了解正在发生的事情。

替代方案需要分配内存和复制对象,这样才能有1个循环。但最终,表现更糟(严格来说)。

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

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

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

(如果您使用的是ARC,请离开autorelease。)

答案 1 :(得分: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就是这样,不会产生临时阵列的额外分配。

答案 2 :(得分:2)

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

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

for (UIButton *button in allButtons) {
    button.enabled = YES;
    button.alpha = 1;
}

答案 3 :(得分: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;
                     }];
}