Подтвердить что ты не робот

Objective-C макрос, чтобы определить, является ли переменная примитивной

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

4b9b3361

Ответ 1

Здесь другой способ, используя C11 общий механизм выбора. _Generic является стандартным (современным) C и некоторое время поддерживается в clang.

#define IS_OBJECT(T) _Generic( (T), id: YES, default: NO)

Он чувствует себя немного меньше времени выполнения для меня, поэтому я предпочитаю его с помощью @encode. Но, честно говоря, я просто использовал его для этого ответа, потому что я люблю власть _Generic дает макросы и думает, что больше людей должны начать использовать его. Если вы этого не знаете, вы должны прочитать статью Роберта Гэмбла, связанную выше.