我有一个方法,我传递一个变量参数列表。我为字符串等做了isKindOfClass
。但是如何确定ivar是否是BOOL?
答案 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 ++可以为您提供所有这些类型的信息(例如使用模板)。