Como obtenho a classe Objective-C de um ivar?
Eu tenho um monte de simplesNSManagedObject
s Eu crio em um teste de unidade. Eles só têm um úniconame
atributo do tipoNSString *
. Eu sempre dou minhaNSManagedObject
o mesmoentityName
eClass
nome.
Eu quero evitar ter que escrever o código a seguir 30 vezes para configurar um teste de unidade:
@interface FooTest : GHTestCase {
Foo *foo;
}
@end
@implementation FooTest
- (void) setUp {
[super setUp];
foo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo"
inManagedObjectContext:managedObjectContext];
foo.name = @"foo";
}
@end
Desde afoo
é um ivar, eu acho que deveria ser capaz de escrever uma macro para pegar o tipo defoo
(Foo
) e use para criar meuFoo
:
#define InsertManagedObjectByVariable(variable) \
do { \
variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])]; \
variable.name = (NSString *) CFSTR(#variable);
} while(0)
No entanto, isso faz com que o seguinte aviso no clang:
variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])];
^
Expected expression
Eu também pensei que eu poderia tentar determinar o tipo usando o tempo de execução object-cIVar
deIvar class_getInstanceVariable(Class cls, const char* name)
, mas o únicoIVar
digite informações disponíveis a partir do tipo de codificação deivar_getTypeEncoding
éid
, o que não é suficiente.
Alguém pode pensar em uma maneira de obter as informações de tipo de umIVar
em tempo de compilação ou tempo de execução?