Я ищу макрос, чтобы определить, является ли переменная объектом или примитивом в 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");
Мне все еще не нравится этот ответ, и надеюсь, что есть что-то slicker. Есть ли что-то в библиотеке времени выполнения, которая делает это?