va_arg处理iOS的struct

时间:2015-08-08 06:21:16

标签: ios

我想获取所有类型的参数值,如何处理结构类型?

for (NSUInteger i = 2; i < methodSignature.numberOfArguments; i++)
{
    const char *argumentType = [methodSignature getArgumentTypeAtIndex:i];
    switch(argumentType[0]) {
        case 'L':
        case 'q':
        case 'l':
        case 's':
        case 'S':
        case 'B':
        case 'b':
        case 'i':
            obj = @(va_arg(args, int));
            break;
        case 'Q':
            obj = @(va_arg(args, unsigned long long));
            break;
        case 'I':
            obj = @(va_arg(args, unsigned int));
            break;
        case 'f':
        case 'd':
            obj = @(va_arg(args, double));
            break;
        case 'C':
            obj = @(va_arg(args, unsigned char));
            break;
        case 'c':
            obj = @(va_arg(args, char));
            break;
        case '{':
        {
            //how could deal with struct object here?
            obj = @"not support";
            break;
        }
            // 其他id类型
        default: {
            obj = va_arg(args, id);
            if (isCoustomObjcBy(obj))
            {
                obj = getPropertiesAndTypesForClassObjc(obj);
            }
            break;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

struct是从C派生的概念,因此没有反射信息,不能直接转换为对象。你可以做的是为struct创建一个包装器对象(一个包装结构的ocj-C类)。你必须在编译时知道结构,但我认为没有办法解决这个问题。