基于if语句的函数最佳实践

时间:2015-07-10 17:02:25

标签: ios

我只是写了这段简单的代码:

-(void)goToStep:(int)step{
    self.step1.hidden = YES;
    self.step2.hidden = YES;
    self.step3.hidden = YES;
    self.step4.hidden = YES;

    if(step == 1)
        self.step1.hidden = NO;
    if(step == 2)
        self.step2.hidden = NO;
    if(step == 3)
        self.step3.hidden = NO;
    if(step == 4)
        self.step4.hidden = NO;
}

现在正在考虑写作是什么样的差异,而不是表现或性能。

-(void)goToStep:(int)step{
    if(step == 1){
        self.step1.hidden = NO;
    self.step2.hidden = YES;
    self.step3.hidden = YES;
    self.step4.hidden = YES;
    }
if(step == 2){
        self.step2.hidden = NO;
    self.step1.hidden = YES;
    self.step3.hidden = YES;
    self.step4.hidden = YES;}
    if(step == 3){
        self.step3.hidden = NO;
    self.step2.hidden = YES;
    self.step1.hidden = YES;
    self.step4.hidden = YES;}
    if(step == 4){
        self.step4.hidden = NO;
    self.step2.hidden = YES;
    self.step3.hidden = YES;
    self.step1.hidden = YES;}
}

交替进行切换,会有什么不同吗?

哪种方式更好?感谢

4 个答案:

答案 0 :(得分:3)

他们都不是。你想要做的是完全覆盖每个案例。因此:

self.step1.hidden = (step != 1);
self.step2.hidden = (step != 2);
// ...

当然,如果你有一个插座集合或其他数组会更好,你可以直接将step转换为索引值来访问所需的对象。

答案 1 :(得分:2)

第二个变种是有缺陷的,它不会做第一个变种。

最好的方法是最可读的(如果它不需要冗余逻辑,那就更好了。)

我建议:

-(void)goToStep:(int)step {
    self.step1.hidden = step != 1;
    self.step2.hidden = step != 2;
    self.step3.hidden = step != 3;
    self.step4.hidden = step != 4;
}

或迭代一个集合:

NSArray *buttons = @[self.step1, self.step2, self.step3, self.step4];
[buttons enumerateObjectsUsingBlock:^(UIButton *button, NSUInteger idx, BOOL *stop) {
    button.hidden = idx != (step - 1);
}];

或者在数字作为键的字典上......有很多方法。 :)

答案 2 :(得分:0)

没有if - else

的不同方法
  // assuming that all steps are hidden by default
  NSArray *steps = @[step1, step2, step3, step4];
  int currentStep = 0;
  step1.hidden = NO;

  - (void)goToStep:(int)step{
    step--; // adjust zero-based index
    if (currentStep != step) {
      steps[currentStep].hidden = YES;
      steps[step].hidden = NO;
      currentStep = step;
    }
  }  

答案 3 :(得分:0)

您的第一个示例和第二个示例表现不同。在第二个示例中,当函数完成时,步骤2,3和1将始终设置为hidden = YES,因为最后三个语句位于if块之外,因此将始终执行。

我通常处理这种情况的方法是将所有4个视图放在一个数组中(比方说我们称之为'self.steps')。然后你的功能变为:

    -(void)goToStep:(int)step {

        for(UIView *stepView in self.steps) {
           [stepView setHidden:YES];
        }

       [[self.steps objectAtIndex:step] setHidden:NO];
    }