Objective-C中條件陳述式的最佳化

來源:互聯網
上載者:User

標籤:objective-c   最佳化   

本文會不定期更新,轉載請註明出處http://blog.csdn.net/uxyheaven/article/details/47780957

Objective-C中條件陳述式的最佳化

要求判斷一個NSArray有值,嚴謹的寫法是

    NSString *object = @"";    if (object && [object isKindOfClass:[NSArray class]] && ((NSArray *)object).count > 0)    {        NSLogDD    }

先判斷這個object非空,再判斷是NSArray類型,再判斷count>0,如果順序寫成

    NSString *object = @"";    if (object && ((NSArray *)object).count > 0 && [object isKindOfClass:[NSArray class]])    {        NSLogDD    }

則會運行錯誤,因為if裡的代碼是串列.
因此,對於多條件的if語句,尤其是大量啟動並執行,我們可以調整 (條件) 的順序,來改善代碼效率.如:

    [scores enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {        if (obj > 59 && obj != 100)        {            NSLogDD        }    }];

當我們取考試及格,但是又不是滿分的人,通常情況下就可以把 > 59 放到前面(通常情況下滿分的人少).

當一段邏輯有多個if出現的情況,如:

+(UIControlEvents)eventWithName:(NSString *)name{    if([name isEqualToString:@"UIControlEventTouchDown"])           return UIControlEventTouchDown;    if([name isEqualToString:@"UIControlEventTouchDownRepeat"])     return UIControlEventTouchDownRepeat;    if([name isEqualToString:@"UIControlEventTouchDragInside"])     return UIControlEventTouchDragInside;    if([name isEqualToString:@"UIControlEventTouchDragOutside"])    return UIControlEventTouchDragOutside;    if([name isEqualToString:@"UIControlEventTouchDragEnter"])      return UIControlEventTouchDragEnter;    if([name isEqualToString:@"UIControlEventTouchDragExit"])       return UIControlEventTouchDragExit;    if([name isEqualToString:@"UIControlEventTouchUpInside"])       return UIControlEventTouchUpInside;    if([name isEqualToString:@"UIControlEventTouchUpOutside"])      return UIControlEventTouchUpOutside;    if([name isEqualToString:@"UIControlEventTouchCancel"])         return UIControlEventTouchCancel;    if([name isEqualToString:@"UIControlEventTouchDown"])           return UIControlEventTouchDown;    if([name isEqualToString:@"UIControlEventValueChanged"])        return UIControlEventValueChanged;    if([name isEqualToString:@"UIControlEventEditingDidBegin"])     return UIControlEventEditingDidBegin;    if([name isEqualToString:@"UIControlEventEditingChanged"])      return UIControlEventEditingChanged;    if([name isEqualToString:@"UIControlEventEditingDidEnd"])       return UIControlEventEditingDidEnd;    if([name isEqualToString:@"UIControlEventEditingDidEndOnExit"]) return UIControlEventEditingDidEndOnExit;    if([name isEqualToString:@"UIControlEventAllTouchEvents"])      return UIControlEventAllTouchEvents;    if([name isEqualToString:@"UIControlEventAllEditingEvents"])    return UIControlEventAllEditingEvents;    if([name isEqualToString:@"UIControlEventApplicationReserved"]) return UIControlEventApplicationReserved;    if([name isEqualToString:@"UIControlEventSystemReserved"])      return UIControlEventSystemReserved;    if([name isEqualToString:@"UIControlEventAllEvents"])           return UIControlEventAllEvents;    return UIControlEventAllEvents;}

我們可以通過 把多個if 改成if () else if… 來最佳化邏輯,同樣可以合理的安排條件的順序.
還有一種更加優美的方法,用字典來代替if, 如

    XY_DicControlStringEvent = [@{@"UIControlEventTouchDown": @(UIControlEventTouchDown),                                 @"UIControlEventTouchDownRepeat": @(UIControlEventTouchDownRepeat),                                 @"UIControlEventTouchDragInside": @(UIControlEventTouchDragInside),                                 @"UIControlEventTouchDragOutside": @(UIControlEventTouchDragOutside),                                 @"UIControlEventTouchDragEnter": @(UIControlEventTouchDragEnter),                                 @"UIControlEventTouchDragExit": @(UIControlEventTouchDragExit),                                 @"UIControlEventTouchUpInside": @(UIControlEventTouchUpInside),                                 @"UIControlEventTouchUpOutside": @(UIControlEventTouchUpOutside),                                 @"UIControlEventTouchCancel": @(UIControlEventTouchCancel),                                 @"UIControlEventValueChanged": @(UIControlEventValueChanged),                                 @"UIControlEventEditingDidBegin": @(UIControlEventEditingDidBegin),                                 @"UIControlEventEditingChanged": @(UIControlEventEditingChanged),                                 @"UIControlEventEditingDidEnd": @(UIControlEventEditingDidEnd),                                 @"UIControlEventEditingDidEndOnExit": @(UIControlEventEditingDidEndOnExit),                                 @"UIControlEventAllTouchEvents": @(UIControlEventAllTouchEvents),                                 @"UIControlEventAllEditingEvents": @(UIControlEventAllEditingEvents),                                 @"UIControlEventApplicationReserved": @(UIControlEventApplicationReserved),                                 @"UIControlEventSystemReserved": @(UIControlEventSystemReserved),                                 @"UIControlEventAllEvents": @(UIControlEventAllEvents)                                 }  retain];
+(UIControlEvents)eventWithName:(NSString *)name{    return [[XY_DicControlStringEvent objectForKey:name] integerValue];}

這裡雖然有個裝箱拆箱的過程,但是邏輯比大量的 if 清晰多了.

我們還可以用三目來最佳化代碼,當然了這個只是說可以,實際不建議用.
如果真的的要用,請按照這種寫法:

    BOOL b = YES;    // 普通寫法    if (b)    {        printf("11");    }    else    {        printf("22");    }    // 三目寫法    (b) ?    ({        printf("11");    })    :    ({        printf("22");    });

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Objective-C中條件陳述式的最佳化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.