用宏檢查實例的空值和類型


我們在實際開發(fā)過程中,有時候需要判斷一些實例的值是否為空和實例的類型是否正確,如果不正確,則是異常情況,要馬上排除。需要及時的定位這種問題,可以用一個宏去實現(xiàn)值的空值和類型判斷。在DEBUG模式下,如果為空值或者類型不正確就會Assert,在RELEASE模式下,只會簡單的返回YES(YES代表實例的值或者類型不正確)

DEMO:

NSString *somethingNotImportant = nil;
if (CheckInvalidAndKindOfClass(somethingNotImportant, NSNumber)) {
    //出錯啦
   return;
}

宏的實現(xiàn)


#ifndef FetchPropertyName
    #define FetchPropertyName(VAL) (@""#VAL)
#endif

#ifndef FetchClass
    #define FetchClass(VAL) ([VAL class])
#endif

#ifndef IsValid
    #define IsValid(VAL) (VAL)
#endif

#ifndef IsKindOfClass
    #define IsKindOfClass(VAL, CLASS) ([VAL isKindOfClass:[CLASS class]])
#endif

#ifndef CheckInvalidAndKindOfClass

#ifdef DEBUG
    #define CheckInvalidAndKindOfClass(VAL, CLASS)                                                                                                              \
    (                                                                                                                                                           \
        (                                                                                                                                                       \
            !IsValid(VAL) ?                                                                                                                                     \
            ^ BOOL {                                                                                                                                            \
                NSAssert(NO, @"NSAssert => %s Line %d\nInvalid value of \"%@\" ", __PRETTY_FUNCTION__, __LINE__, FetchPropertyName(VAL));                       \
                return YES;                                                                                                                                     \
            }()                                                                                                                                                 \
            :                                                                                                                                                   \
            NO                                                                                                                                                  \
        )                                                                                                                                                       \
        ||                                                                                                                                                      \
        (                                                                                                                                                       \
            !IsKindOfClass(VAL, CLASS) ?                                                                                                                        \
            ^ BOOL {                                                                                                                                            \
                NSAssert(NO, @"NSAssert => %s Line %d\nexpected class \"%@\" but class \"%@\" given ", __PRETTY_FUNCTION__, __LINE__, [CLASS class], FetchClass((VAL)));                                                                                                                                   \
                return YES;                                                                                                                                     \
            }()                                                                                                                                                 \
            :                                                                                                                                                   \
            NO                                                                                                                                                  \
        )                                                                                                                                                       \
    )
#else

    #define CheckInvalidAndKindOfClass(VAL, CLASS) ((!IsValid(VAL)) || (!IsKindOfClass(VAL, CLASS)))

#endif

#endif

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容