目标C - 编写if语句的更好方法

时间:2015-01-05 14:57:20

标签: ios objective-c if-statement

这不是一个实际问题,但令我感到沮丧.. 我正在寻找一种更好的方法来纠正一个IF语句,其中包含多个可以接受的值。

例如:

if ([[myJson objectForKey:@"pages"] intValue] == 0 || [[myJson objectForKey:@"pages"] intValue] ==  3)

没有办法写出类似的东西:

if ([[myJson objectForKey:@"pages"] intValue] == 0 | 3)
{

}

谢谢!

6 个答案:

答案 0 :(得分:8)

不,不是真的。你可以这样做:

int pages = [[myJson objectForKey:@"pages"] intValue];
if (pages == 0 || pages == 3)

这就是我的建议。您发布的代码比我显示的代码效率更低,维护更难。

在您的代码中,您实际上会在同一对象上两次调用objectForKeyintValue方法。

另外,如果在将来的某个时刻更改键值或变量名称,则必须在2个位置进行相同的编辑,这样做会更多,并且会增加另一个引入新的复制/粘贴错误的机会。

答案 1 :(得分:3)

除了其他有效答案外,您还可以使用开关:

int numberOfPages = [[myJson objectForKey:@"pages"] intValue];
switch (numberOfPages) {
    case 0:
    case 3: {
        NSLog(@"Is 0 or 3");
        break;
    }
    default: {
        NSLog(@"Is NOT 0 or 3");
        break;
    }
}

答案 2 :(得分:1)

这是一个更好的方法,因为它干净且易于阅读:

int x = [[myJson objectForKey:@"pages"] intValue];

if (x == 0 || x == 3) {

}

答案 3 :(得分:1)

你在那里非常乐观。

如果myJson不是NSDictionary,您的应用就会崩溃。

如果myJson[@"pages"]不是NSNumber,那么您的应用就会崩溃。

如果myJson[@"pages"]不存在,那么intValue将返回0.

如果myJson[@"pages"]的值为0.9或3.7,则intValue将返回0或3.

我建议您使用类似NSDictionary withDefault的方法向integerValueForKey:添加一个类别,您可以在其中查找项目,检查它是带有整数值的NSNumber,返回该值或返回默认值。

答案 4 :(得分:0)

DavidRönnqvist指出,这主要是一个偏好问题。我个人会使用包含允许值的NSArray。这样,您就不会使用不必要的intValue调用来混乱您的代码。另外,添加另一个允许值只需要向数组添加单个值,而不是在if语句中添加另一个条件。

请注意,您可以使用Objective-C文字语法使代码更简洁。

NSArray *allowedValues = @[@0, @3];
if([allowedValues containsObject:myJson[@"pages"]]) {

}

答案 5 :(得分:0)

如果[myJson objectForKey:@"pages"]NSNumber。你可以这样做:

if([@[@0, @3] containsObject:[myJson objectForKey:@"pages"]])

如果myJsonNSDictionary,您甚至可以将其缩短为:

if([@[@0, @3] containsObject:myJson[@"pages"]])

它不一定是最佳的,但它确实为您提供了更多的灵活性,当您添加更多值进行检查时,它听起来像您正在寻找而不是最快的代码。如果您只是检查一些值,我假设执行速度不是问题。


附注:这是有效的,因为NSArray的{​​{1}}方法会在每个对象上调用containsObject:isEqual:的{​​{1}}被调用。如果您正在使用此功能,这也适用于NSNumber而不是isEqualToNumber:。在这种情况下,只需更改搜索数组以保留NSString个对象。