确定ivar是否为BOOL

时间:2012-07-30 10:24:12

标签: iphone objective-c ios

我有一个方法,我传递一个变量参数列表。我为字符串等做了isKindOfClass。但是如何确定ivar是否是BOOL?

2 个答案:

答案 0 :(得分:4)

不,不是在运行时。 BOOL是一种原始类型,而不是类。实际上BOOL是一个签名的字符。

typedef signed char     BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#define OBJC_BOOL_DEFINED


#define YES             (BOOL)1
#define NO              (BOOL)0

作为一种解决方法,您可以将BOOL包装在NSNumber中以从中生成Obj-C对象。然后你可以做运行时检查:

NSNumber * n = [NSNumber numberWithBool:YES]; // @(YES) in Xcode 4.4 and above
if (strcmp([n objCType], @encode(BOOL)) == 0) {
    NSLog(@"this is a bool");
} else if (strcmp([n objCType], @encode(int)) == 0) {
    NSLog(@"this is an int");
}

编辑:此代码可能不适用于BOOL,因为它在内部编码为char。有关替代解决方案,请参阅此答案:https://stackoverflow.com/a/7748117/550177

答案 1 :(得分:0)

键值编码可能能够帮助您解决此问题。有些原语(例如valueForKey:)能够检查对象的ivars并执行内置的转换。从这个意义上说,您将传递给(ivar名称为字符串)的函数,并让系统执行NSNumber转换,其中类型是C基元。当然,这会引入一些开销。

你也可以使用objc运行时来解决这个问题,但是KVC可能会做你需要的而不需要求助于使用objc运行时(你自己)。

如果要确定va_list 参数是否为BOOL,则需要指定它(这就是为什么需要格式说明符)。您在某些情况下看到的替代方案是-[NSArray initWithObjects:...] - 在这种情况下,初始化程序需要每个参数的objc对象,以及nil-termination;您需要进行BOOL - >对象促销。

替代方案:C ++可以为您提供所有这些类型的信息(例如使用模板)。