Objective-C:如何检查变量是对象,结构还是其他原语

Dja*_*ngo 7 primitive struct objective-c

我想编写一个函数或指令,如NSLog(),它接受任何类型的变量,基元和对象.在那个功能中,我想区分那些.

我知道它对于对象是如何工作的:

- (void)test:(id)object {
    if ([object isKindOfClass:[NSString class]])
        ...
Run Code Online (Sandbox Code Playgroud)

但是如何区分对象与结构甚至整数或浮点数.就像是:

"isKindOfStruct:CGRect" or "isInt" 
Run Code Online (Sandbox Code Playgroud)

例如?

这可能吗?我想,因为你可以将所有内容发送到NSLog(@"......",对象,整数,结构),它必须是可能的吗?

谢谢你的帮助!

编辑

我的最终目标是实现某种多态性.

我希望能够调用我的函数:

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

or [self MYFUNCTION:int]...
Run Code Online (Sandbox Code Playgroud)

并在MY_FUNCTION中

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

我知道isKindOf不存在,你甚至不能在原语上执行这样的方法.我也不确定"???" 函数头中的泛型类型"value".

那可能吗?

Ale*_*ray 8

#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
Run Code Online (Sandbox Code Playgroud)

另外,请查看Vincent Gable的最有用的Objective-C Code我曾经写过的一些非常方便的东西,使用@encode()编译器指令(那)返回一个字符串,描述它给出的任何类型..."

LOG_EXPR(x)是打印出x的宏,无论x是什么类型,都不必担心格式字符串(以及与例如以与NSString相同的方式打印C字符串的相关崩溃).它适用于Mac OS X和iOS.


Cal*_*leb 3

像这样的函数NSLog()可以从作为第一个参数传递的格式字符串中得知其参数列表中期望的类型。因此,您不需要查询参数来确定它的类型 - 您可以根据格式字符串确定您期望的类型,然后相应地解释该参数。