用宏检查实例的空值和类型


我们在实际开发过程中,有时候需要判断一些实例的值是否为空和实例的类型是否正确,如果不正确,则是异常情况,要马上排除。需要及时的定位这种问题,可以用一个宏去实现值的空值和类型判断。在DEBUG模式下,如果为空值或者类型不正确就会Assert,在RELEASE模式下,只会简单的返回YES(YES代表实例的值或者类型不正确)

DEMO:

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

宏的实现


#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

你可能感兴趣的:(用宏检查实例的空值和类型)