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?
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:
En el ejemplo dado, se puede usar de la siguiente manera:
Esto imprimiría ‘1 0x1’ (suponiendo que la dirección del objeto asignado es ‘0x1’).