为NSInteger使用多个else if语句

时间:2014-05-08 20:21:34

标签: ios if-statement nsinteger

我有一段代码,其中我想要为TableView单元格提供不同的accessoryView,基于该单元格条目的编号。我设置的代码是:

NSInteger warriors = [entry.prayerWarriors intValue];

        if (warriors == 0) {
            //Do nothing
            //NSLog(@"0");
        }
        else if (0 < warriors < 50) {
            cell.accessoryView = firstLevel;
           // NSLog(@"50");

        }
        else if (51 < warriors < 100) {
            cell.accessoryView = secondLevel;
          //  NSLog(@"100");

        }
        else if (101 < warriors < 500) {
            cell.accessoryView = thirdLevel;
         //   NSLog(@"500");

        }
        else {
            cell.accessoryView = fourthLevel;
         //   NSLog(@"A Lot");

        }

然而,它总是只返回战士的第一个条目== 0.我做错了什么?

5 个答案:

答案 0 :(得分:2)

而不是这样做......

else if (0 < warriors < 50) {
    cell.accessoryView = firstLevel;
    // NSLog(@"50");
}

这样做......

else if (0 < warriors && warriors < 50) {
    cell.accessoryView = firstLevel;
    // NSLog(@"50");
}

修改

要回答你的评论...你可能意味着在那里有一些&lt; =或&gt; =,因为当战士等于你的if条件(50,100或500)的边界时,它会转到最后一个。

你可能希望它看起来像这样......

 NSInteger warriors = [entry.prayerWarriors intValue];

    if (warriors == 0) {
        //Do nothing
        //NSLog(@"0");
    }
    else if (0 < warriors && warriors <= 50) {
        cell.accessoryView = firstLevel;
        // NSLog(@"50");

    }
    else if (50 < warriors && warriors <= 100) {
        cell.accessoryView = secondLevel;
        //  NSLog(@"100");

    }
    else if (100 < warriors && warriors <= 500) {
        cell.accessoryView = thirdLevel;
        //   NSLog(@"500");

    }
    else {
        cell.accessoryView = fourthLevel;
        //   NSLog(@"A Lot");

    }

答案 1 :(得分:1)

声明

if (0 < warriors < 50)

评估与您想象的不同。第一部分

(0 < warriors)

计算为布尔值,并将该布尔值与50进行比较。

所以,你需要这样做:if (0 < warriors && warriors < 50)

答案 2 :(得分:0)

其他答案对后来需要逻辑的案例提出了好的观点,但是如果你遇到if (warriors == 0) {,那么你的对象entry.prayerWarriors很可能是零。放一个断点并将其打印出来。 (并打印出它的类以确保其符合预期)

同样轻微但习惯于转换我猜测的是NSNumber并不是使用与变量相同的类型。由于您正在写入NSInteger,因此应将intValue替换为integerValue

答案 3 :(得分:0)

为清楚起见,我更喜欢在每个条件中首先放置变量并封装条件的每个部分:

if (warriors == 0) {
 //Do nothing
NSLog(@"0");
}
else if ((warriors > 0) && (warriors < 50))
{
cell.accessoryView = firstLevel;
NSLog(@"50");
}
else if ((warriors > 51) && (warriors < 100)) {
 cell.accessoryView = secondLevel;
 NSLog(@"100");
    }
    else if ((warriors > 101) && (warriors < 500)) {
        cell.accessoryView = thirdLevel;
        NSLog(@"500");
    }
    else {
        cell.accessoryView = fourthLevel;
        NSLog(@"A Lot");
    }

请确保你已经有足够的条件来解决这些问题。

答案 4 :(得分:0)

您不需要if级联:

您可以将关卡存储一次

NSArray *levels = @[firstLevel, secondLevel, thirdLevel, fourthLevel];

并使用索引:

if( warriors > 0) {
  cell.accessoryView = levels[(warriors-1) / 50]
}

如果你希望有if级联,则不必仔细检查:

NSInteger warriors = [entry.prayerWarriors intValue];

if (warriors == 0) {
    //Do nothing
    //NSLog(@"0");
}
else if (warriors <= 50) {
    cell.accessoryView = firstLevel;
    // NSLog(@"50");

}
else if (warriors <= 100) {
    cell.accessoryView = secondLevel;
    //  NSLog(@"100");

}
else if (warriors <= 500) {
    cell.accessoryView = thirdLevel;
    //   NSLog(@"500");

}
else {
    cell.accessoryView = fourthLevel;
    //   NSLog(@"A Lot");

}

如果您在其他地方,则已经测试过前一个条件失败。(这就是其他意思。)