条件语句的优化

要求判断一个NSArray有值,严谨的写法是

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. NSString *object = @"";  
  2.   
  3. if (object && [object isKindOfClass:[NSArray class]] && ((NSArray *)object).count > 0)  
  4. {  
  5.     NSLogDD  
  6. }  

先判断这个object非空,再判断是NSArray类型,再判断count>0,如果顺序写成

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. NSString *object = @"";  
  2.   
  3. if (object && ((NSArray *)object).count > 0 && [object isKindOfClass:[NSArray class]])  
  4. {  
  5.     NSLogDD  
  6. }  

则会运行错误,因为if里的代码是串行.

因此,对于多条件的if语句,尤其是大量运行的,我们可以调整 (条件) 的顺序,来改善代码效率.如:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [scores enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOLBOOL *stop) {  
  2.     if (obj > 59 && obj != 100)  
  3.     {  
  4.         NSLogDD  
  5.     }  
  6. }];  


当我们取考试及格,但是又不是满分的人,通常情况下就可以把 > 59 放到前面(通常情况下满分的人少).


当一段逻辑有多个if出现的情况,如:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. +(UIControlEvents)eventWithName:(NSString *)name  
  2. {  
  3.     if([name isEqualToString:@"UIControlEventTouchDown"])           return UIControlEventTouchDown;  
  4.     if([name isEqualToString:@"UIControlEventTouchDownRepeat"])     return UIControlEventTouchDownRepeat;  
  5.     if([name isEqualToString:@"UIControlEventTouchDragInside"])     return UIControlEventTouchDragInside;  
  6.     if([name isEqualToString:@"UIControlEventTouchDragOutside"])    return UIControlEventTouchDragOutside;  
  7.     if([name isEqualToString:@"UIControlEventTouchDragEnter"])      return UIControlEventTouchDragEnter;  
  8.     if([name isEqualToString:@"UIControlEventTouchDragExit"])       return UIControlEventTouchDragExit;  
  9.     if([name isEqualToString:@"UIControlEventTouchUpInside"])       return UIControlEventTouchUpInside;  
  10.     if([name isEqualToString:@"UIControlEventTouchUpOutside"])      return UIControlEventTouchUpOutside;  
  11.     if([name isEqualToString:@"UIControlEventTouchCancel"])         return UIControlEventTouchCancel;  
  12.     if([name isEqualToString:@"UIControlEventTouchDown"])           return UIControlEventTouchDown;  
  13.     if([name isEqualToString:@"UIControlEventValueChanged"])        return UIControlEventValueChanged;  
  14.     if([name isEqualToString:@"UIControlEventEditingDidBegin"])     return UIControlEventEditingDidBegin;  
  15.     if([name isEqualToString:@"UIControlEventEditingChanged"])      return UIControlEventEditingChanged;  
  16.     if([name isEqualToString:@"UIControlEventEditingDidEnd"])       return UIControlEventEditingDidEnd;  
  17.     if([name isEqualToString:@"UIControlEventEditingDidEndOnExit"]) return UIControlEventEditingDidEndOnExit;  
  18.     if([name isEqualToString:@"UIControlEventAllTouchEvents"])      return UIControlEventAllTouchEvents;  
  19.     if([name isEqualToString:@"UIControlEventAllEditingEvents"])    return UIControlEventAllEditingEvents;  
  20.     if([name isEqualToString:@"UIControlEventApplicationReserved"]) return UIControlEventApplicationReserved;  
  21.     if([name isEqualToString:@"UIControlEventSystemReserved"])      return UIControlEventSystemReserved;  
  22.     if([name isEqualToString:@"UIControlEventAllEvents"])           return UIControlEventAllEvents;  
  23.     return UIControlEventAllEvents;  
  24. }  
我们可以通过 把多个if 改成if () else if... 来优化逻辑,同样可以合理的安排条件的顺序.

还有一种更加优美的方法,用字典来代替if, 如

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. XY_DicControlStringEvent = [@{@"UIControlEventTouchDown": @(UIControlEventTouchDown),  
  2.                              @"UIControlEventTouchDownRepeat": @(UIControlEventTouchDownRepeat),  
  3.                              @"UIControlEventTouchDragInside": @(UIControlEventTouchDragInside),  
  4.                              @"UIControlEventTouchDragOutside": @(UIControlEventTouchDragOutside),  
  5.                              @"UIControlEventTouchDragEnter": @(UIControlEventTouchDragEnter),  
  6.                              @"UIControlEventTouchDragExit": @(UIControlEventTouchDragExit),  
  7.                              @"UIControlEventTouchUpInside": @(UIControlEventTouchUpInside),  
  8.                              @"UIControlEventTouchUpOutside": @(UIControlEventTouchUpOutside),  
  9.                              @"UIControlEventTouchCancel": @(UIControlEventTouchCancel),  
  10.                              @"UIControlEventValueChanged": @(UIControlEventValueChanged),  
  11.                              @"UIControlEventEditingDidBegin": @(UIControlEventEditingDidBegin),  
  12.                              @"UIControlEventEditingChanged": @(UIControlEventEditingChanged),  
  13.                              @"UIControlEventEditingDidEnd": @(UIControlEventEditingDidEnd),  
  14.                              @"UIControlEventEditingDidEndOnExit": @(UIControlEventEditingDidEndOnExit),  
  15.                              @"UIControlEventAllTouchEvents": @(UIControlEventAllTouchEvents),  
  16.                              @"UIControlEventAllEditingEvents": @(UIControlEventAllEditingEvents),  
  17.                              @"UIControlEventApplicationReserved": @(UIControlEventApplicationReserved),  
  18.                              @"UIControlEventSystemReserved": @(UIControlEventSystemReserved),  
  19.                              @"UIControlEventAllEvents": @(UIControlEventAllEvents)  
  20.                              }  retain];  

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. +(UIControlEvents)eventWithName:(NSString *)name  
  2. {  
  3.     return [[XY_DicControlStringEvent objectForKey:name] integerValue];  
  4. }  
这里虽然有个装箱拆箱的过程,但是逻辑比大量的 if 清晰多了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值