美文网首页零碎知识点iOS Developer
用宏检查实例的空值和类型

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

作者: Easyin999 | 来源:发表于2016-11-13 13:57 被阅读74次

我们在实际开发过程中,有时候需要判断一些实例的值是否为空和实例的类型是否正确,如果不正确,则是异常情况,要马上排除。需要及时的定位这种问题,可以用一个宏去实现值的空值和类型判断。在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

相关文章

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

    我们在实际开发过程中,有时候需要判断一些实例的值是否为空和实例的类型是否正确,如果不正确,则是异常情况,要马上排除...

  • Swift 可空类型

    可空类型(optional)是Swift的独特特性,用来指定某个实例可能没有值。可空类型的实例,要么有值且已经可用...

  • Swift Day06 值类型 引用类型 闭包

    一、值类型、引用类型 1. 用 let 修饰 结构体实例的值类型 和 类实例的引用类型 时,分别修改它们的成员变量...

  • Swift5.1类型转换&扩展

    18.类型转换 类型检查类型检查:用类型检查操作符( is )来检查一个实例是否属于特定子类型。若实例属于那个子类...

  • swift学习

    检查类型 用类型检查操作符( is )来检查一个实例是否属于特定子类型。若实例属于那个子类型,类型检查操作符返回 ...

  • swift3语法(十五)

    类型转换 类型检查操作符用类型检查操作符(is)来检查一个实例是否属于特定子类型。若实例属于那个子类型,类型检查操...

  • Swift学习笔记  可空类型

    可空类型(optional)是Swift的独特特性,用来指定某个实例可能没有值。看到可空类型时,表明该实例一定:要...

  • c# 可空值类型和string

    可空值类型 是System.Nullable这个struct的实例 可空值类型除了可以正确的表示其底层数据类...

  • const 关键字 - iOS

    一、const与宏的区别 处理时刻:宏是预处理时(即在预处理时把宏展开,替换为原来的值, 没有类型,不做类型检查)...

  • 行为型模式-空对象模式

    空对象模式: 在空对象模式中,一个空对象取代NULL对象实例的检查。Null对象不是检查空值,而是反应一个不做任何...

网友评论

    本文标题:用宏检查实例的空值和类型

    本文链接:https://www.haomeiwen.com/subject/larcpttx.html