Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Objective-C: How to check if a variable is an object, a struct or another primitive

I want to write a function or a directive like NSLog() that takes any kind of variable, primitives and objects. In that function I want to distinguish those.

I know how it works for objects:

- (void)test:(id)object {
    if ([object isKindOfClass:[NSString class]])
        ...

but how do I distinguish objects from structs or even integer or floats. Something like:

"isKindOfStruct:CGRect" or "isInt" 

for example?

Is this possible? I thought since you can send everything to NSLog(@"...", objects, ints, structs) it must be possible?

Thanks for any help!

EDIT

My ultimate goal is to implement some kind of polymorphism.

I want to be able to call my function:

MY_FUNCTION(int)
MY_FUNCTION(CGRect)
MY_FUNCTION(NSString *)
...

or [self MYFUNCTION:int]...

and in MY_FUNCTION

-(void)MYFUNCTION:(???)value {
    if ([value isKindOf:int])
        ...
    else if ([value isKindOf:CGRect])
        ...
    else if ([value isKindOfClass:[NSString class]])
        ...
 }

I know that isKindOf doesn't exists and you can't even perform such methods on primitives. I'm also not sure about the "???" generic type of "value" in the function header.

Is that possible?

like image 223
Django Avatar asked Apr 06 '12 15:04

Django


1 Answers

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

NSRect    a = (NSRect){1,2,3,4};
NSString* b = @"whatAmI?";
NSInteger c = 9;

NSLog(@"%@", IS_OBJECT(a)?@"YES":@"NO"); // -> NO
NSLog(@"%@", IS_OBJECT(b)?@"YES":@"NO"); // -> YES
NSLog(@"%@", IS_OBJECT(c)?@"YES":@"NO"); // -> NO

Also, check out Vincent Gable's The Most Useful Objective-C Code I’ve Ever Written for some very handy stuff that uses the @encode() compiler directive (that) returns a string describing any type it’s given..."

LOG_EXPR(x) is a macro that prints out x, no matter what type x is, without having to worry about format-strings (and related crashes from eg. printing a C-string the same way as an NSString). It works on Mac OS X and iOS.

like image 184
Alex Gray Avatar answered Sep 22 '22 11:09

Alex Gray