¿Cómo obtengo la clase Objective-C de un ivar?
Tengo un montón de simplesNSManagedObject
s creo en una prueba unitaria. Solo tienen unaname
atributo de tipoNSString *
. Siempre doy miNSManagedObject
lo mismoentityName
yClass
nombre.
Quiero evitar tener que escribir el siguiente código 30 veces para configurar una prueba de unidad:
@interface FooTest : GHTestCase {
Foo *foo;
}
@end
@implementation FooTest
- (void) setUp {
[super setUp];
foo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo"
inManagedObjectContext:managedObjectContext];
foo.name = @"foo";
}
@end
Ya quefoo
es un ivar, creo que debería poder escribir una macro para capturar el tipo defoo
(Foo
), y utilizar para crear miFoo
:
#define InsertManagedObjectByVariable(variable) \
do { \
variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])]; \
variable.name = (NSString *) CFSTR(#variable);
} while(0)
Sin embargo, esto provoca la siguiente advertencia en clang:
variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])];
^
Expected expression
También pensé que podía intentar determinar el tipo utilizando el tiempo de ejecución de object-cIVar
desdeIvar class_getInstanceVariable(Class cls, const char* name)
, pero el únicoIVar
información de tipo disponible a partir de la codificación de tipo deivar_getTypeEncoding
esid
, que no es suficiente.
¿Puede alguien pensar en una manera de obtener la información de tipo de unIVar
ya sea en tiempo de compilación o en tiempo de ejecución?