这不是一个实际问题,但令我感到沮丧.. 我正在寻找一种更好的方法来纠正一个IF语句,其中包含多个可以接受的值。
例如:
if ([[myJson objectForKey:@"pages"] intValue] == 0 || [[myJson objectForKey:@"pages"] intValue] == 3)
没有办法写出类似的东西:
if ([[myJson objectForKey:@"pages"] intValue] == 0 | 3)
{
}
谢谢!
答案 0 :(得分:8)
不,不是真的。你可以这样做:
int pages = [[myJson objectForKey:@"pages"] intValue];
if (pages == 0 || pages == 3)
这就是我的建议。您发布的代码比我显示的代码效率更低,维护更难。
在您的代码中,您实际上会在同一对象上两次调用objectForKey
和intValue
方法。
另外,如果在将来的某个时刻更改键值或变量名称,则必须在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"]])
如果myJson
是NSDictionary
,您甚至可以将其缩短为:
if([@[@0, @3] containsObject:myJson[@"pages"]])
它不一定是最佳的,但它确实为您提供了更多的灵活性,当您添加更多值进行检查时,它听起来像您正在寻找而不是最快的代码。如果您只是检查一些值,我假设执行速度不是问题。
附注:这是有效的,因为NSArray
的{{1}}方法会在每个对象上调用containsObject:
。 isEqual:
的{{1}}被调用。如果您正在使用此功能,这也适用于NSNumber
而不是isEqualToNumber:
。在这种情况下,只需更改搜索数组以保留NSString
个对象。