es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Macro para autoboxear automáticamente (primitivas) si no es NSObject.

Tengo esta macro que detecta si una variable es un objeto:

#define IS_OBJECT(x) ( strchr(""@#"", @encode(typeof(x))[0]) != NULL )
#define AUTO_BOX(x) IS_OBJECT(x) ? x : @(x)

Quería simplificar mi flujo de trabajo al envolver automáticamente cualquier primitivo para poder hacer rápidamente algo como esto:

BOOL v1 = YES;
id v2 = [[NSObject alloc] init];
NSLog(@"%@ %@", AUTO_BOX(v1), AUTO_BOX(v2));
//the @"%@ %@" format is non-changeable, I can't change them to @"%d %@" or @"%x %@"

Por supuesto, esto generará un error para v2 ya que es un objeto:

 error: illegal type 'id' used in a boxed expression

¿Qué puedo hacer para solucionar esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el error, puedes reemplazar la macro AUTO_BOX por una nueva macro que utilice un operador ternario para verificar si la variable es un objeto o no. Si la variable es un objeto, utiliza el operador de caja ‘@’ para encajar el objeto. Si es un primitivo, utiliza el operador de caja ‘NSNumber numberWith…’ para encajar el primitivo. Aquí está la macro actualizada:

    #define AUTO_BOX(x) (IS_OBJECT(x) ? @(x) : [NSNumber numberWith##__VA_ARGS__ : x])
    

    En el ejemplo dado, se puede usar de la siguiente manera:

    BOOL v1 = YES;
    id v2 = [[NSObject alloc] init];
    NSLog(@"%@ %@", AUTO_BOX(v1), AUTO_BOX(float, v2));
    

    Esto imprimiría ‘1 0x1’ (suponiendo que la dirección del objeto asignado es ‘0x1’).

Comments are closed.