2012-04-04 5 views
2

Есть ли способ упростить этот метод? Возможно, путь к & & оба утверждения вместе в одном for-loop?Есть ли способ упростить этот оператор IBOutletConnection?

// 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]; 
    } 
} 
+0

Только боковое примечание может быть немного странным, чтобы увидеть смешение точечной и скобочной нотации рядом друг с другом (с которой легче работать, в этом случае было бы проще выбрать один. –

ответ

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)

+0

хорошо сделано, это работает отлично. Спасибо – Joey

2

Думаю, что это самый простой вы можете сделать это. В качестве альтернативы вы можете реорганизовать код на другой метод и передать оба массива этому методу.

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

for (UIButton *button in allButtons) { 
    button.enabled = YES; 
    button.alpha = 1; 
} 
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; 
        }]; 
} 
4

Мне кажется, что вы пытаетесь сделать это DRY и бит, который повторяется, - это то, что происходит в теле. o f цикл. Я не вижу необходимости выделять новый массив только так вы только перебирать одной коллекции, так что я бы сделать что-то вроде этого

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 вот оно и не берет на себя дополнительное выделение временного массив.

Смежные вопросы