我正在寻找一个宏来检测一个变量是Objective-C中的对象还是原语。
在这种情况下,我知道参数必须是变量并且永远不会是表达式。
这是我想出的最好的东西:
#define IS_OBJECT(x) ( @encode(__typeof__(x))[0] == '@' )
#define IS_PRIMITIVE(x) ( !IS_OBJECT(x) )
用法:
NSString *testString = @"test";
NSString *nilString = nil;
NSInteger testInteger = 1;
STAssertTrue(IS_OBJECT(testString), @"IS_OBJECT(testString) must be YES");
STAssertTrue(IS_OBJECT(nilString), @"IS_OBJECT(nilString) must be YES");
STAssertFalse(IS_OBJECT(testInteger), @"IS_OBJECT(testInteger) must be NO");
一定会有更好的办法。
更新
考虑到@ChrisDevereux 的评论,我更新了 IS_OBJECT 宏。
#define IS_OBJECT(x) ( strchr("@#", @encode(__typeof__(x))[0]) != NULL )
它现在通过了:
NSString *testString = @"test";
NSString *nilString = nil;
NSInteger testInteger = 1;
Class classTest = [NSString class];
STAssertTrue(IS_OBJECT(testString), @"IS_OBJECT(testString) must be YES");
STAssertTrue(IS_OBJECT(nilString), @"IS_OBJECT(nilString) must be YES");
STAssertFalse(IS_OBJECT(testInteger), @"IS_OBJECT(testInteger) must be NO");
STAssertTrue(IS_OBJECT(classTest), @"IS_OBJECT(classTest) must be YES");
我仍然不喜欢这个答案,并希望有一些更光滑的东西。运行时库中有什么东西可以做到这一点吗?